2014-07-14 92 views
1

我確切地知道發生了什麼,但無法弄清楚我的生活,我已經脫離了編程一段時間,所以原諒醜陋的代碼..for循環顯示2,然後3結果?

幾乎我試圖做一個「挑帽子」概念的名字......我想有隨機‘匹配’選擇 但我會表現出一定的時間:

Harry v Kwok 
Matthew v Lewis 
James v Ceri 

那麼別人是:

Ceri v James 
Kwok v Harry 

import java.util.*; 
    public class hatpicking { 
    public static void main(String[] args) { 
    //Links one value to other--- eg. 0 = ceri, 1 = Harry  
    HashMap<Integer, String> map = new HashMap<Integer, String>(); 

    map.put(0, "Ceri"); 
    map.put(1, "Harry"); 
    map.put(2, "Matthew"); 
    map.put(3, "Lewis"); 
    map.put(4, "Kwok"); 
    map.put(5, "James"); 

    int HashmapValue = 6; 

    //For loops that only makes 3 fixtures 
    for(int i=1; i<20; i++){           
     //Generates 2 Random Numbers 
     int first = (int) (Math.random() * HashmapValue); 
     int second = (int)(Math.random()* HashmapValue); 

     //Assigns the 2 numbers to the hashmap values 
     String val1 = (String)map.get(first); 
     String val2 = (String)map.get(second); 

    if(val1 != null && val1 != val2 && val2 != null){    

     map.remove(first); 
     map.remove(second); 

     //prints Fixtures 
     System.out.println(val2 + " v " + val1); 
      }   
     } 
    } 
} 
+0

究竟是什麼問題?發生了什麼,你不指望? –

+0

據推測,有時'val1 == val2'並且該條目被跳過。 –

+0

'val1'和'val2'是字符串,您應該用'.equals()'比較它。並嘗試提供[MCVE](http://stackoverflow.com/help/mcve)。 –

回答

0

如果我理解你的問題,那是因爲有時候val1 == val2。你可以一個else塊添加到您的if

// != is only safe because of reference equality due to the Map(s). 
if(val1 != null && val1 != val2 && val2 != null){ 
    map.remove(first); 
    map.remove(second); 

    //prints Fixtures 
    System.out.println(val2 + " v " + val1); 
} else { 
    i--; // repeat. 
} 

編輯

根據您的意見,我真的有Collections.shuffle()

String[] competitors = { "Ceri", "Harry", 
    "Matthew", "Lewis", "Kwok", "James" }; 
Collections.shuffle(Arrays.asList(competitors)); 
for (int i = 0; i < competitors.length; i += 2) { 
    System.out.printf("%s v %s%n", competitors[i], 
     competitors[i + 1]); 
} 
3

你需要得到幸運的,實現它您生成的值仍然在Map。您始終會生成一個介於0和5之間的數字,但在移除元素時地圖會變小。剛剛從20次嘗試改變循環狀態保持下去,直到map爲空:

while (!map.isEmpty()) { 
    // Generates 2 Random Numbers 
    int first = (int) (Math.random() * HashmapValue); 
    ... 
+2

這已將我的問題排序。我非常感謝你,我覺得把我的顯示器撕掉了。 –

0

你應該用在代表你的人口列表中的一個簡單的排列: 僞代碼

List<Player> list= {...} << put what ever represent your player 

for(int i= 0 ; i < list.size ; i++) { //Random permutation 
    int j = random(list.size) // return 
    list.swap(i,j); 
} 

List<Group> groups; 
for (int i = 0 ; i < list.size - 1; i+=2){ 
    groups.add(new Group(list.get(i), list.get(i+1); 
}