如何检查String ArrayList中的多个项的String

时间:2014-06-25 23:33:41

标签: java arraylist

我有一个ArrayList并添加我要检查的字符串。

ArrayList<String> al = new ArrayList<String>();
    al.add("is");
    al.add("the");

然后我有一个方法返回在String中找到的匹配,该匹配也在ArrayList中。

public static String getWord(String str1, ArrayList<String> list)
{
    for(int i = 0; i < list.size(); i++)
    {
        if(str1.toLowerCase().contains(list.get(i)))
        {
            return list.get(i);
        }
    }
    return false;
}

虽然当我想检查一个有多个匹配的String时,它只返回添加到ArrayList中的第一个,所以

al.add("is");
al.add("the");

它将返回&#34;是&#34;

如果我像这样添加它们

al.add("the");
al.add("is");

它将返回&#34;&#34;

我需要一种方法来确定有多少匹配并单独返回。

4 个答案:

答案 0 :(得分:1)

尝试使用Map来保持,键作为List中的字符串,值将是计数匹配

public static void main(String[] args) throws Exception
{
    List<String> list = new ArrayList<String>();
    list.add("aa");
    list.add("bb");
    list.add("cc");
    list.add("dd");
    list.add("ee");
    list.add("ff");
    list.add("kk");
    list.add("ff");

    System.out.println(getWord("aabbccddeeff", list));
}

public static Map<String, Integer> getWord(String str1, List<String> list)
{
    Map<String, Integer> map = new HashMap<String, Integer>();
    Integer count = 1;

    for (String match : list)
    {
        if(str1.toLowerCase().contains(match))
        {
            if(map.containsKey(match))
            {
                count = map.get(match);
                count++;

            }
            map.put(match, count);
        }
    }

    return map;
}

答案 1 :(得分:0)

尝试使用其他数组列表来保存匹配

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

al.add("is");
al.add("the");
//...

ArrayList<String> result = getWord("something", a1);

// return matches individually with indexes or use indexOf...
result.get(1);
result.get(result.indexOf("something random"));


// how many matches = size of the array list
result.size();


// ...

public static ArrayList<String> getWord(String str1, ArrayList<String> list)
{

    ArrayList<String> matches = new ArrayList<String>();
    String testString = str1.toLowerCase();

    for(int i = 0; i < list.size(); i++)
    {
        if(testString.contains(list.get(i)))
        {
            matches.add(list.get(i));
        }
    }
    return matches;
}

希望这有帮助。

答案 2 :(得分:0)

O(nm)解决方案:

如果您的字符串长度为m且列表长度为n,则您在原始问题中显示的算法会以O(mn)时间复杂度运行,因为它必须遍历整个列表O(n)然后搜索整个字符串O(m)

O(n+m)解决方案:

但是,你可以做得更好如果首先可以将字符串分成单个单词(例如"The dog jumped"会给["The", "dog", "jumped"])。在这种情况下,您可以将O(m + n)的运行时间首先分离为存储在HashSet<String>中的单个单词,然后在列表中搜索每个单词。

E.g。

Set<String> getWords(String str, Set<String> words){  // using set removes dups

    Set<String> indvWords = getIndividualWords(str);  // O(m)
    Set<String> matchedWords = new HashSet<String>(); // O(1)      

    for(String word : words)                          // O(n)
        if(indvWords.contains(word))                  // O(1)
            matchedWords.add(word);                   // O(1) 

    return matchedWords;
}                                                     // total: O(m + n)

当然,您必须自己实施Set<String> getIndividualWords(String str),可能使用String#split(String) regex pattern,例如:

Set<String> getIndividualWords(String str){
    return new HashSet<String>(str.split("\\W")); // split string by non words
}

答案 3 :(得分:-1)

public static void getWord(String str1, ArrayList<String> list)
{
    for(int i = 0; i < list.size(); i++)
    {
        if(str1.toLowerCase().contains(list.get(i)))
        {
            System.out.println(list.get(i));
        }
    }

}