Как я могу выполнить циклический перебор 2 ArrayLists?

У меня есть задание для школы, где мне нужно сделать программу, которая автоматически делает пары для уроков в школе. В этом случае есть 6 уроков, и на каждом уроке вы сотрудничаете с другим человеком. Таким образом, на неделе 1 человек a был партнером человека b, а в последующие недели он не может сотрудничать с человеком a.

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

Вот код, который у меня уже есть (извините, он не на английском):

public void maakKoppels() {
    if (leerlingenLijst.size() % 2 == 1) {
        // if you have an odd number of students it adds the "Bye" student
        leerlingenLijst.add(new Leerling("Bye"));
    }

    for (int i = 1; i <= 6; i++) {
        //its needed for 6 lessons so it does it 6 times
        maakKoppels(i, leerlingenLijst);
    }
}

public void maakKoppels(int weekNum, ArrayList<Leerling> leerlingenLijst) {
    int midden = leerlingenLijst.size() / 2; //split the arraylist in 2

    ArrayList lijst1 = new ArrayList();
    for (int j = 0; j < midden; j++) {
        lijst1.add(leerlingenLijst.get(j));
    }

    ArrayList lijst2 = new ArrayList();
    for (int j = leerlingenLijst.size() - 1; j >= midden; j--) {
        lijst2.add(leerlingenLijst.get(j));
    }
    // here it fills the lessons with the 2 lists. weekNum is the lesson
    // number and the name on lijst1 at index 0 couples with the name on
    // lijst2 at index zero
    practica.add(new Practicum(weekNum, lijst1, lijst2));
}

person Liam de Haas    schedule 21.01.2014    source источник
comment
Я добавил номер недели как смещение в списке 2. теперь это выглядит так: lijst2.add(LeerlingenLijst.get(J - weekNum));   -  person Liam de Haas    schedule 21.01.2014


Ответы (3)


Один из способов решения, как показано ниже...

  1. Разделите весь класс на два массива. L1 и L2
  2. создать переменную offset = 0
  3. В первую неделю назначьте L1[0] и L2[0+смещение] как одну пару, L1[1] и L2[1+смещение] как другую пару и так далее.
  4. Смещение второй недели = 1
  5. назначьте L1[0] и L2[0+смещение] как одну пару, но на этот раз вы фактически назначите L1[0] и L2[1] как пару из-за увеличенного значения смещения. 6. Чтобы убедиться, что вы не превысите длину L2, используйте (0+смещение)%L2.length()

Это гарантирует, что у вас будет новая пара каждую неделю.

person Buddha    schedule 21.01.2014

Самый простой способ... начните с 1-го элемента в 1-м массивеList, перетасуйте второй массив и выберите первый элемент. карта.. в следующий раз, когда вы создаете пары, снова перетасуйте второй массив.. теперь для каждой созданной пары сначала проверьте, существует ли человек из второго массива для того же ключа на карте. Если нет, добавьте значение в список (значение карты), иначе снова перетасуйте список и попробуйте. Вам понадобится ключ, список в карте...

Map<String,List> hm = new HashMap<String, List>();
List<String> l = new ArrayList<String>();
Collections.shuffle(arrayList2);

Теперь ваша очередь реализовать логику. И извините, я не могу дать вам код...

person TheLostMind    schedule 21.01.2014
comment
не могли бы вы привести пример в коде? у меня нет опыта работы с картами - person Liam de Haas; 21.01.2014
comment
Этого достаточно, сейчас разберусь :) Спасибо! - person Liam de Haas; 21.01.2014

Разделение класса на два — хорошее начало. Теперь вы можете повернуть список1, оставив список2 как есть, и соединить {list1.get(1),list2.get(1)}, {list1.get(2),list2.get(2)} и т. д. Поверните list1 на одну (неделю) и повторите все сначала.

Если у вас более 12 студентов, которые будут работать в течение ваших шести недель. При таком подходе студенты, находящиеся в одном списке, никогда не могут быть парой.

person Ralf    schedule 21.01.2014