我想计算列表中的字符串匹配数: 我的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));
}
答案 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