计数字符串匹配数给出错误的结果

时间:2014-03-15 17:17:49

标签: java string count string-matching

我想计算列表中的字符串匹配数: 我的ArrayList包含:

recognise
product
product
process
process
process
principle
partner
particular

这样输出应该是:

recognise 1
product 2
process 3
principle 1
partner 1
particular 1

我的代码是:

List<String> mylist=new LinkedList<String>();
HashMap<String, Integer> result= new LinkedHashMap<String, Integer>();

        for (int i = 0; i < wordlist.size(); i++) {
            mylist.add(wordlist.get(i));   //wordlist contains the above mentioned items
        }
        Collections.sort(mylist);
        Collections.reverse(mylist);

String small="";
int c=0;

for(int i=0;i<mylist.size();i++)
{
    c+=1;
    small=mylist.get(i);
    for(int j=i;j<mylist.size();j++)
    {
        if(small.contains(mylist.get(j)))
            {
                small=mylist.get(j);

            }
    }
    if (!result.containsKey(small) || result.get(small) < c){
        result.put(small, c);
        c=0;
    }


}
for (String key : result.keySet()){
    System.out.println(key + ": " + result.get(key)); 
}

2 个答案:

答案 0 :(得分:0)

如果您只想计算列表中每个字符串的出现次数,那么这就足够了:

for(String s : mylist) {
    if(result.containsKey(s)) {
        result.put(s, result.get(s) + 1);
    } else {
        result.put(s, 1);
    }
}

无需排序/反转/ etc mylist

要对计数进行排序,只需使用SortedMap提供Comparator(我之前没有经验,所以您最好自己查找API)。

答案 1 :(得分:0)

算法的时间复杂度似乎很高,O(N^2*length_max) 但是,您可以在O(N)中执行此操作,其中N =通过trie确定所有字符串长度的总和,
 其中每个节点包含一个整数i,它表示字符串在该节点结束的次数,以及char ch

struct node 
{
    int i;  
    char ch;
}  

ALGORITHM: 当遍历字符串时,如果它不在trie中,则将其插入trie,否则遍历trie,当字符串结束时,执行i=i+1,在此处再标记一个字符串。

请参阅:https://stackoverflow.com/questions/296618/what-is-the-most-common-use-of-the-trie-data-structure