我有一个字符串数组,想要计算任何单个字符串的出现次数。
我已经对它进行了分类。 (这是一个长阵列,我想摆脱O(n²)-loop)
这里是我的代码..显然它在ind.outOfB中用完了。 exc ..原因很清楚,但我不知道如何解决..
for (int i = 0; i < patternsTest.length-1; i++) {
int occ=1;
String temp=patternsTest[i];
while(temp.equals(patternsTest[i+1])){
i++;
occ++;
}
}
答案 0 :(得分:11)
这对于HashMap来说是一个好地方,键是Word,值是它发生的次数。 Map.containsKey
和Map.get
方法是常量时间查找,速度非常快。
Map<String,Integer> map = new HashMap<String,Integer>();
for (int i = 0; i < patternsTest.length; i++) {
String word=patternsTest[i];
if (!map.containsKey(word)){
map.put(word,1);
} else {
map.put(word, map.get(word) +1);
}
}
作为附带好处,您甚至不需要事先排序!
答案 1 :(得分:4)
您可以使用Java HashMap:
Map<String, Integer> occurrenceOfStrings = new HashMap<String, Integer>();
for(String str: patternsTest)
{
Integer currentValue = occurrenceOfStrings.get(str);
if(currentValue == null)
occurrenceOfStrings.put(str, 1);
else
occurrenceOfStrings.put(str, currentValue + 1);
}
答案 2 :(得分:0)
这没有超出范围的索引:
String[] patternsTest = {"a", "b"};
for (int i = 0; i < patternsTest.length-1; i++) {
int occ=1;
String temp=patternsTest[i];
while(temp.equals(patternsTest[i+1])){
i++;
occ++;
}
}
您可以通过将数据更改为:
来使索引超出界限String[] patternsTest = {"a", "a"};
答案 3 :(得分:0)
你可以尝试一个地图,只有一个循环
Map<String, Integer> occurences = new HashMap<String, Integer>();
String currentString = patternsTest[0];
Integer count = 1;
for (int i = 1; i < patternsTest.length; i++) {
if(currentString.equals(patternsTest[i]) {
count++;
} else {
occurrences.put(currentString, count);
currentString = patternsTest[i];
count = 1;
}
}
occurrences.put(currentString, count);
答案 4 :(得分:0)
Guava Multiset解决方案(两行代码):
Multiset<String> multiset = HashMultiset.create();
multiset.addAll(Arrays.asList(patternsTest));
//Then you could do...
multiset.count("hello");//Return count the number of occurrences of "hello".
我们可以使用它排序和未排序的数组。易于维护代码。
答案 5 :(得分:0)
我的解决方案是:
public int cantOccurences(String pattern, String[] values){
int count = 0;
for (String s : values) {
count += (s.replaceAll("[^".concat(pattern).concat("]"), "").length());
}
return count;
}