Java计数排序数组中每个项目的出现次数

时间:2013-05-24 23:22:51

标签: java arrays find-occurrences

我有一个字符串数组,想要计算任何单个字符串的出现次数。

我已经对它进行了分类。 (这是一个长阵列,我想摆脱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++;
        }
    }

6 个答案:

答案 0 :(得分:11)

这对于HashMap来说是一个好地方,键是Word,值是它发生的次数。 Map.containsKeyMap.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;
}