2012-11-29 153 views
3

我需要編寫一個程序來查找一個數字是否以多於一次的50個數字出現。Java查找次數出現的次數

我有陣列生成50個隨機數字,但不能似乎一輪讓我的頭寫循環得到它,看看有多少是一樣的..

+4

歡迎來到SO,你到目前爲止嘗試過什麼? – PermGenError

+0

你到目前爲止編碼了什麼? – Mirco

+0

無論你曾經嘗試過粘貼 –

回答

1

下面的代碼將統計每個卷號碼和店鋪數的numbers map:

Map<Integer, Integer> numbers = new HashMap<Integer, Integer>(); 
for (int i = 0; i < 50; i++) { 
    Integer num = die.roll(); 
    Integer count = numbers.get(num); 
    if (count == null) { 
     count = Integer.valueOf(0); 
    } 
    count = Integer.valueOf(count.intValue() + 1); 
    numbers.put(num, count); 
} 

然後你可以檢查所有的地圖條目,並找到那些滾動多次。

for (Map.Entry<Integer, Integer> entry : numbers.entrySet()) { 
    if (entry.getValue().intValue() > 1) { 
     System.out.println(entry.getKey() + " rolled more than once"); 
    } 
} 

或者你也可以在第一個循環只是改變狀態輸出的數字有:

for (int i = 0; i < 50; i++) { 
    Integer num = die.roll(); 
    Integer count = numbers.get(num); 
    if (count != null) { 
     System.out.println(num + " rolled more than once"); 
    } else { 
     numbers.put(num, Integer.valueOf(1)); 
    } 
} 

最後,你仍然可以使用陣列找到它編號:

for (int i = 0; i < 50; i++) { 
    nums[i] = die.roll(); 
    for (int j = i - 1; j >= 0; j--) { 
     if (nums[i] == nums[j]) { 
      System.out.println(nums[i] + " rolled more than once"); 
      break; 
     } 
    } 
} 
0

你可以嘗試整理數據

int[] nums = new int[50]; 
for(int i = 0; i < nums.length; i++) nums[i] = die.roll(); 
java.util.Arrays.sort(nums); 
int dupes = 0; 
for(int i = 0; i < nums.length - 1; i++) { 
    if(nums[i] == nums[i+1) dupes++; 
} 

對數據進行排序可以將所有相同的元素放在彼此旁邊,這樣您就可以一次找到它們。當然,你必須對它進行排序,這不是一次性的操作。

這消除了使用地圖的開銷,並且仍然非常快。排序是n lg n,這比使用地圖的解決方案要慢,但是如此小的地圖開銷可能是重要的。代碼本身也很容易遵循。

看到,一個10元件陣列中使用數字0-19此自包含例如(按比例縮小,方便審查數;概念完全適用。)

import java.util.*; 
class Christine { 
    static Random random = new Random(); 
    static int dieroll() { 
     return random.nextInt(20); 
    } 
    public static void main(String[] args) { 
     int[] nums = new int[10]; 
     for(int i = 0; i < nums.length; i++) nums[i] = dieroll(); 
     System.out.println(Arrays.toString(nums)); 
     Arrays.sort(nums); 
     int dupes = 0; 
     for(int i = 0; i < nums.length - 1; i++) { 
      if(nums[i] == nums[i+1]) dupes++; 
     } 
     System.out.println(dupes); 
    } 


} 

運行該示例如下所示:

c:\files\j>javac Christine.java 

c:\files\j>java Christine 
[2, 9, 8, 5, 11, 12, 15, 15, 16, 7] 
1 

c:\files\j>java Christine 
[10, 10, 1, 18, 11, 6, 4, 3, 9, 5] 
1 

c:\files\j>java Christine 
[8, 0, 13, 4, 5, 4, 16, 13, 6, 18] 
2 

在第一次運行中,有兩個15。第二,有兩個10。第三,有兩個13和兩個4。

考慮這個例子:

c:\files\j>java Christine 
[17, 19, 19, 3, 19, 4, 18, 19, 1, 1] 
4 

此計數3個愚弄爲4個不同的19S,和用於兩個1一個重複數據刪除。現在爲什麼在19年代有3個傻瓜?因爲如果我們稱19s a,b,c和d,a將b看作是一個重複,b將c看作是一個重複,並且c將d看作重複。所以有三個。你必須添加額外的邏輯才能使它更加強大,以便捕獲所有6個模糊。

+0

你的代碼將產生IndexOutOfBoundsException異常,哎呀呀。忽略它 - 我是盲人 – hoaz

+0

@Christine它確實有效。我做了一個自包含的例子,說明它確實有效,我即將編輯它。 – corsiKa