2013-09-26 56 views
0

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

我希望我的程序的输出是这样的:
1发生:2倍
2发生:1times
3发生:1times
6发生:1times

但我的程序给出了一个的这样的输出:
1发生:1times
1发生:2倍
2发生:1times
3发生:1times
6发生:1times

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; 
} 
+5

您可以使用hashmap来做到这一点。 – vikiiii

+0

看看http://stackoverflow.com/questions/8098601/java-count-occurrence-of-each-item-in-an-array :) – sufinawaz

+3

请避免没有大括号的statemts。 –

回答

1

看起来,类似于你的方法,但只使用一个数组(并且没有hashmaps)。我测试过,它的工作原理。

 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"); 
    } 
+1

这真的很糟糕,真的:'values [i] == values [i + 1]'甚至起作用的原因是编译器实习生字符串文字。试着从用户的输入中读取'values'来看看这个分割。强制打印循环内最后一项的逻辑非常复杂,它会让我的大脑受到伤害。我明白你以OP的方法为出发点,所以我不会低估这一点,但我认为这样的修正可能会让OP完全错误。 – dasblinkenlight

1

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

一旦你看到为什么还有一个额外的println,请尝试修复你的代码,如果你需要帮助,请回来一些具体的问题。

1

你的代码是太快了,在打印决定:而不是让每values项目一个println,你需要每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()); 
} 

Demo on ideone

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()));