我制作了一个计算数组中元素的程序。它有效但我的程序中存在一些错误。
我希望我的程序输出如下:
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;
}
答案 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}}
答案 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()));