0

我做了一个程序来计算数组中的元素。它可以工作,但我的程序中有一种错误。

我希望我的程序的输出是这样的:
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

4 回答 4

1

这就是问题所在:您只希望出现四个打印语句,但您得到了五个。因为这段代码缺少花括号并且缩进不好,你可能会也可能不会看到 println 函数属于 i 循环。i 循环将运行多少次?提示:它是 i.length,在这种情况下等于_ _(您填写空白)。

一旦你明白为什么会有一个额外的 println,试着修复你的代码,如果你需要帮助,然后再回来提出具体的问题。

于 2013-09-26T15:05:09.080 回答
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");
     }  
于 2013-09-26T15:06:27.160 回答
1

您的代码在打印其决定时太快了:您需要在数组中找到的每个不同项目调用一次,而不是对println的每个项目进行一次。valuesvalues

一种方法是使用 aMap<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());
}

ideone 上的演示

于 2013-09-26T15:07:36.243 回答
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()));
于 2013-09-26T15:17:02.120 回答