Я точно знаю, что происходит, но не могу понять это для жизни меня, я уже давно не занимаюсь программированием, поэтому извиняюсь за уродливый код.
в значительной степени я пытаюсь сделать концепцию "выбрать имя шляпы"... поскольку я хочу, чтобы были выбраны случайные "совпадения", но несколько раз я буду отображаться:
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);
}
}
}
}
Вам должно быть повезло, что ваши сгенерированные значения все еще находятся на Map
. Вы всегда генерируете число от 0 до 5, но при удалении элементов карта становится меньше. Просто измените условие цикла из 20 попыток продолжить движение до тех пор, пока map
будет пустой:
while (!map.isEmpty()) {
// Generates 2 Random Numbers
int first = (int) (Math.random() * HashmapValue);
...
Если я понимаю вашу проблему, это потому, что иногда 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]);
}
Вы должны использовать простую перестановку над списком, представляющим ваше население: псевдокод будет
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);
}
val1 == val2
и эта запись пропускается.