2017-06-14 44 views
-3
public static void main(String[] args){ 
     int size = 90; 

     ArrayList<Integer> list = new ArrayList<Integer>(size); 
     for(int i = 1; i <= size; i++) { 
      list.add(i); 
     } 

     Random rand = new Random(); 
     while(list.size() > 0) { 
      int index = rand.nextInt(list.size()); 
      System.out.println("BOY: "+list.remove(index)); 
      System.out.println("Girl: "+list.remove(index)); 
     } 
    } 
} 

這裏是我做了什麼,而我仍然獲得在線程異常「主」 java.lang.IndexOutOfBoundsException: Index: 45, Size: 45. 我能做些什麼來解決這個問題。我是如何分配90席至40名男孩和50名女孩沒有重複在Java中

+0

使用迭代器 –

+4

您正在生成一個基於列表大小的隨機索引一次,但隨後刪除該索引處的項目兩次。您只能保證第一次刪除時該索引處存在某些內容。 – azurefrog

+1

「挑選一系列隨機列表元素」的更好方法是不要隨意挑選。相反,洗牌清單,然後只是遍歷它。 – azurefrog

回答

0

java.lang.IndexOutOfBoundsException: Index: 45, Size: 45內聲明。

原因是您訪問索引45大小45列表。當您從列表中隨機刪除元素時,您的列表大小會減少。所以這個-會在你每次運行程序的時候改變。

作爲一個解決方案,您可以更改:

int index = rand.nextInt(list.size()); 

要:

int index = rand.nextInt(list.size()-1); 

上面一行將低於一個數值隨機從列表的大小。

+1

工作完美...非常感謝 – FETUGA

+0

我創建了90個不同名稱的數組... – FETUGA

+0

更改int index = rand.nextInt(list.size() - 1) ; int index = rand.nextInt(list.size() - 89);它不工作 – FETUGA

1

一般算法是將男孩和女孩列入清單,然後使用Collections.shuffle(arrayList); 隨機化訂單。

之後,您可以撥打list.remove(0)爲您分配的每個座位。

1

對於當前的代碼,你必須得到一個隨機的男孩,然後隨機爲一個女孩。

錯誤是因爲如果隨機給你的列表大小,你會試圖刪除最後一個元素兩次。

現在,你的代碼會給你45個女生席位和45個男生。要解決它使用兩個,如果同時

 if(list.size()>10){ 
//get a random for a boy and then a random for a girl 
}else{ 
//get a random for a girl 
} 
+0

沒有。從列表中刪除一個元素後,其他元素向下移動一個元素。如果你看看oracle文檔,你可以看到這個 - **刪除列表中指定位置的元素。將任何隨後的元素向左移(從其索引中減去一)** – Blasanka

+1

你是正確的,但這就是他得到錯誤的原因。他使用相同的索引來刪除兩個元素,如果隨機給了他最後一個索引,比如9(列表大小爲10)。第二次刪除後,他將嘗試刪除索引9,索引9不再存在,因爲列表的大小現在是9 –

+0

是啊..是的。當它來到最後一個索引。 – Blasanka