для циклов отображается 2, а затем 3 результата?

1

Я точно знаю, что происходит, но не могу понять это для жизни меня, я уже давно не занимаюсь программированием, поэтому извиняюсь за уродливый код.

в значительной степени я пытаюсь сделать концепцию "выбрать имя шляпы"... поскольку я хочу, чтобы были выбраны случайные "совпадения", но несколько раз я буду отображаться:

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 и эта запись пропускается.
Показать ещё 3 комментария
Теги:

3 ответа

3

Вам должно быть повезло, что ваши сгенерированные значения все еще находятся на Map. Вы всегда генерируете число от 0 до 5, но при удалении элементов карта становится меньше. Просто измените условие цикла из 20 попыток продолжить движение до тех пор, пока map будет пустой:

 while (!map.isEmpty()) {
     // Generates 2 Random Numbers
     int first = (int) (Math.random() * HashmapValue);
     ...
  • 2
    Это разобрало мою проблему. Я благодарю вас, я чувствовал, что вырываю свой монитор.
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]);
}
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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню