2013-10-31 129 views
0

我已經寫存儲一些值一個java PROG:爪哇 - 在陣列計數數字

public class array05 { 
    public static void main(String[] args) { 

     //placement of value 
     int arryNum[] = {2,3,4,5,4,4,3}; 

     //placement of index, to start at 0 
     for(int counter=0;counter<arryNum.length;counter++){ 
      System.out.println(counter + ":" + arryNum[counter]); 
     } 
    } 
} 

其中產生這樣的輸出:
0:2
1:3
2:4
3:5
4:4
5:4
6:3

,現在我需要在此輸出#1中計數數字。 輸出#2應該是這樣的:

1:0
2:1
3:2
4:3
5:1

這意味着它計數ONE 2,TWO 3,三4,並且只有一個5.

我不知道如何編寫輸出2的代碼。 是否需要二分法搜索?

有人可以開燈嗎?

+1

問題的陳述是否包括在陣列中的數字有限制嗎?也就是說,他們都保證少於10? –

+0

http://stackoverflow.com/q/8098601/1007273 – hovanessyan

+0

你試圖實現計數排序。 –

回答

2

,如果你在你的陣列值1-5之間期待(我假設這從您的預期輸出數)

int arryNum[] = { 2, 3, 4, 5, 4, 4, 3 }; 
int[] counter = new int[] { 0, 0, 0, 0, 0 }; 
for (int i = 0; i < arryNum.length; i++) { 
    counter[arryNum[i] - 1]++; 
} 

for (int i = 0; i < counter.length; i++) 
    System.out.println((i + 1) + ":" + counter[i]); 
+0

感謝您的幫助,我可以通過這種方法輕鬆理解!但是我不明白這個部分[arryNum [i] - 1],你介意解釋嗎? – Ree

+0

這很容易理解,但如果數組包含的值不在1到5之間,那麼它就會中斷。例如,對於這個數組:「{0,2,3,4,5,4,4,3}」。由於這些數字似乎並不代表只能在1-5之間的任何數字,所以這不是一種好的做法。 (可能是確定的作業)的陣列 –

+0

@rzrz指數爲0,而你的號碼從1 – user902383

4

我建議你使用一個Map

  • 如果號碼不存在它,用1
  • 如果該號碼存在添加,添加1〜它的價值。

然後打印地圖作爲keyvalue

例如,對於您的陣列{2,3,4,5,4,4,3}這將工作如下:

是否在地圖中包含的關鍵2?否,請將其與值1相加。(3,45相同)
地圖是否包含4?是!給它的值加1。現在關鍵 4具有值的2
...

+2

他會說「但我們還沒有學過地圖!」 –

+0

沒時間像現在學習地圖!遠非有用忽視,並且是解決這個問題的最簡單方法! – NickJ

+0

FYI:如果實現假定所有映射值(不是鍵)不能爲空,而不是檢查,看是否存在的關鍵,只是試圖獲得與鍵的值。如果它返回null,那麼你知道該鍵也不存在。這比通過鍵循環更快(當你說「containsKey」時會發生什麼)。它是O(1)與O(n)。 – MadConan

2

事情是這樣的:

//numbers to count 
int arryNum[] = {2,3,4,5,4,4,3}; 

//map to store results in 
Map<Integer, Integer> counts = new HashMap<Integer, Integer>(); 

//Do the counting 
for (int i : arryNum) { 
    if (counts.containsKey(i) { 
     counts.put(i, counts.get(i)+1); 
    } else { 
     counts.put(i, 1); 
    } 
} 

//Output the results 
for (int i : counts.keySet()) { 
    System.out.println(i+":"+counts.get(i)); 
} 
+0

沒有人發現故意的錯誤 - 我有hasKey()代替的containsKey()。現在更正。 :) – NickJ

3

這是一個解決這個問題:

import java.util.Arrays; 

public class array05 { 
    public static void main(String[] args) { 
     //placement of value 
     int arryNum[] = {2,3,4,5,4,4,3}; 

     // Sort the array so counting same objects is easy 
     Arrays.sort(arryNum); 

     int index = 0; // The current index 
     int curnum;  // The current number 
     int count;  // The count of this number 
     while (index < arryNum.length) { 
      // Obtain the current number 
      curnum = arryNum[index]; 

      // Reset the counter 
      count = 0; 

      // "while the index is smaller than the amount of items 
      // and the current number is equal to the number in the current index, 
      // increase the index position and the counter by 1" 
      for (; index < arryNum.length && curnum == arryNum[index]; index ++, count++); 

      // count should contain the appropriate amount of the current 
      // number now 
      System.out.println(curnum + ":" + count); 
     } 
    } 
} 

人們使用Map貼好解決方案,所以我想我會提供一個始終有效的良好解決方案(不只是針對當前值),而不使用Map

+0

嗨,感謝您的幫助,但如果我沒有在陣列中的一個,如何顯示它呢? EG - 1:0 – Ree

+0

您的聲明:「這意味着它計數了一個2,2個3,3個4,只有一個5」讓我想到它只需要計算數組中存在的項目。我很抱歉,如果這個不適合你的需求:) –

+1

這不是O(n)的複雜性,但至少爲O(n的log(n)) – user902383

3
If you don't want to use Map, this is how you would do it with Arrays only(if you have numbers from 1 to 9 only) 

Integer[] countArray = new Integer[10] 

// Firstly Initialize all elements of countArray to zero 
// Then 
for(i=0;i<arryNum.length();i++){ 

int j = arryNum[i]; 
countArray[j]++; 

} 

這countArray爲0在第一的位置,在第2位中1的個數等

2

使用地圖存儲計數值:

import java.util.HashMap; 
import java.util.Map; 

class array05{ 
    public static void main(String[] args){ 
     // Container for count values 
     Map <Integer, Integer> result = new HashMap<Integer, Integer>(); 
     int arryNum[] = {2,3,4,5,4,4,3}; 
     for(int i: arryNum){ //foreach more correct in this case 
      if (result.containsKey(i)) result.put(i, result.get(i)+1); 
      else result.put(i, 1); 
     } 
     for (int i: result.keySet()) System.out.println(i + ":" + result.get(i)); 
    } 
} 

結果如下:

2:1 
3:2 
4:3 
5:1 
+0

謝謝你的地圖建議,如果我想包含不在數組中的數字,那麼怎麼樣?例如:沒有數字1因此輸出是1:0 – Ree

+0

它可能,但更復雜。在這種情況下,你不能使用泛型。可能是你需要使用'getClass'(http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html)從'Object'轉換 –

+0

查看我的答案更新 –

1

你可以試試這個方式太

int arrayNum[] = {2,3,4,5,4,4,3}; 
    Map<Integer,Integer> valMap=new HashMap<>(); 
    for(int i:arrayNum){ // jdk version should >1.7 
     Integer val=valMap.get(i); 
     if(val==null){ 
      val=0; 
     } 
     valMap.put(i,val+1); 
    } 
    Arrays.sort(arrayNum); 
    for(int i=0;i< arrayNum[arrayNum.length-1];i++){ 
     System.out.println(i+1+" : "+((valMap.get(i+1)==null) ? 0:valMap.get(i+1))); 
    } 

出把

1 : 0 
    2 : 1 
    3 : 2 
    4 : 3 
    5 : 1 

但下列方式是更好的

int arrayNum[] = {2,3,4,5,4,4,3}; 
    Arrays.sort(arrayNum); 
    int countArray[]=new int[arrayNum[arrayNum.length-1]+1]; 
    for(int i:arrayNum){ 
     countArray[i]= countArray[i]+1; 
    } 
    for(int i=1;i<countArray.length;i++){ 
     System.out.println(i+" : "+countArray[i]); 
    } 

出把

1 : 0 
    2 : 1 
    3 : 2 
    4 : 3 
    5 : 1