计算数组中的元素

时间:2013-09-26 14:55:40

标签: java arrays count

我制作了一个计算数组中元素的程序。它有效但我的程序中存在一些错误。

我希望我的程序输出如下:
1次发生:2次
2发生:1次
3发生:1次
6次发生:1次

但是我的程序给出了这样的输出:
1次发生:1次
1次发生:2次
2发生:1次
3发生:1次
6次发生:1次

String[] values= {"1", "1", "3", "6", "2"};
int[] counts = new int[values.length]; 
Arrays.sort(values);
int temp = 0;
int c = 0;
for(int i = 0; i < values.length; i++){
  counts[i] = Integer.parseInt(values[i]);
  for(int j = 0;j < counts.length; j++) {
    if(counts[i] == counts[j]) {
      c++;
    }
  }
  System.out.println(counts[i] + " occured: " + c +" times");
  c = 0;
}

4 个答案:

答案 0 :(得分:1)

问题在于:您只需要发布四个打印语句,但是您将获得五个。因为此代码缺少大括号并且具有错误缩进,您可能会或可能不会看到println函数属于i循环。 i循环要运行多少次?提示:它是i.length,在这种情况下等于 _ _(你填空)。

一旦你知道为什么有一个额外的println,尝试修复你的代码,如果你需要帮助,请回过头来回答具体的问题。

答案 1 :(得分:1)

看,类似于您的方法,但只使用一个数组(并且没有哈希映射)。我测试了它的确有效。

     String[] values= {"1","1","3","6","2"};     
     Arrays.sort(values);
     int c=1,i=0;
     while(i<values.length-1){
         while(values[i].equals(values[i+1])){
             c++; 
             i++;   
         }   
         System.out.println(values[i] + " appeared " + c + " times");            
         c=1;
         i++;
         if(i==values.length-1)
             System.out.println(values[i] + " appeared " + c + " times");
     }  

答案 2 :(得分:1)

您的代码在打印决策时速度太快:而不是每println项生成一个values,您需要在每个 distinct 项目中调用一次values Map<String,Integer>数组。

这样做的一种方法是使用Map<String,Integer> counts = new HashMap<String,Integer>(); for (String s : values) { if (counts.containsKey(s)) { int old = counts.get(s); counts.put(s, old+1); } else { counts.put(s, 1); } } for (Map.Entry<String,Integer> entry : counts.entrySet()) { System.out.println(entry.getKey() + " - " + entry.getValue()); } 来计算项目。你可以这样做:

{{1}}

Demo on ideone

答案 3 :(得分:1)

Apache的CollectionUtils有一个内置的实用工具方法,类似于dasblinkenlight的方法:

Map<String, Integer> counts = 
    CollectionsUtils.getCardinalityMap(Arrays.asList(values));
for (Map.MapEntry<String,Integer> entry : counts) {
    System.out.println(entry.getKey() + " - " + entry.getValue());
}

编辑:
更新旧答案。 Java 8流有一个内置的等价物:

Map<Stirng, Long> = 
    Arrays.stream(values)
          .collect(Collectors.groupingBy(Function.identity(), 
                   Collectors.counting()));