如何通过搜索给定字符并创建新的 ArrayList 来分解 ArrayList<String>?

我试图通过在每个字符串中搜索给定字符来分解字符串ArrayList。根据字符的共同位置将列表分成新列表。


如果数组是


list1 = new String[] {"fish", "look", "flow", "fowl", "cool"}; 

给定的字符是 'l' 那么我会得到 4 个新数组 no l "----"(fish), "l---"(look), "-l--"(flow), "-- -l"(鸡,酷)。数组列表中将包含相应的字符串。我得到的错误是:


java.lang.AssertionError

ArrayList<String> ret = f.familiesOf('l');

        assertTrue(ret.contains("----"));



    public Family_2(String[] w)

    {

        words = w;

    }


    /**

     * Given a single character, return an ArrayList of

     * all the word families. Each family should

     * appear only once in the ArrayList and there should be none

     * that aren't needed. The returned list can be in any order.

     */


    public ArrayList<String> familiesOf(char c)

    {

        String fam = "";

        ArrayList<String> wordList = new ArrayList<String>();

        ArrayList<String> wordList2 = new ArrayList<String>();

        Collections.addAll(wordList, words);

        String longestString = wordList.get(0);


        // when I added the below code I stopped getting an out of bounds exception.


        for (String element : wordList)

        {

            if (element.length() > longestString.length()) {

                longestString = element;

            }

        }   


        // This is where I'm struggling with checking and separating the ArrayList.


        for(int i = 0; i < words.length; i++)

        {

            if(words[i].indexOf(c) != c)

            {

                fam += '-'; 

                wordList2 = wordList;

            }

            else if(words[i].indexOf(c) == c)

            {

                fam += c;

                wordList2 = wordList;

            }

        }

        return wordList;

    }

这是刽子手游戏的前身。


回首忆惘然
浏览 107回答 1
1回答

呼唤远方

我认为实现算法的关键是选择正确的数据结构。我认为正确的数据结构是Map。键Map将是Integer(因为键不能是原语,所以它不能是int),它将是字母的索引,值将是在该索引处具有相关字母的单词列表。这是我根据您详细说明的规范和限制实现该算法的代码。import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class HangsMan {    public static void main(String[] args) {        String[] words = new String[]{"fish", "look", "flow", "fowl", "cool", "eel", "poll", "fill"};        char letter = 'l';        Map<Integer, List<String>> theMap = new HashMap<>();        Integer key;        List<String> value;        for (String word : words) {            int ndx = word.indexOf(letter);            int last = word.lastIndexOf(letter);            if (last == ndx + 1) {                ndx += 1_000_000;            }            key = Integer.valueOf(ndx);            if (theMap.containsKey(key)) {                value = theMap.get(key);            }            else {                value = new ArrayList<String>();                theMap.put(key, value);            }            value.add(word);        }        theMap.forEach((k, v) -> System.out.println(v));    }}请注意,双字母单词会在索引中添加 1_000_000(一百万),以便将它们与单字母单词分开。因此, “poll”一词的索引将为 1,000,002,而“ cold”一词的索引仅为 2。你问我为什么要加一百万?因为,根据维基百科,英语中最长的单词包含189,819 个字母。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java