2013-09-26 203 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()));