Сравнение двух списков массивов с объектом того же типа.Как получить все элементы первого списка, кроме тех, которые содержатся во втором списке?

#java #arraylist

#java #arraylist

Вопрос:

Я работаю над базовой системой учащихся.У студента есть поле его sudy. Каждой области обучения присвоено несколько предметов. Каждому ученику назначается 2 из этих предметов. Теперь мне нужно получить и распечатать все остальные предметы, отнесенные к его области обучения, которые ему еще не присвоены. Вот что я попробовал

         ArrayList<Predmet> dostupnePredmety = new ArrayList<Predmet>();
        for (Predmet vPredmet : this.loggedStudent.getOdbor().getPredmety()) {
            for ( Predmet sPredmet : this.loggedStudent.getPredmety()) {
                if (vPredmet != sPredmet) {
                    dostupnePredmety.add(vPredmet);
                }
            }
        }
        int i = 0;
        for (Predmet dPredmet : dostupnePredmety) {
            System.out.println("["   i   "]"   dPredmet.getNazov()   " "   dPredmet.getPocetStudentov()   "/"   dPredmet.getCapacity());
            i  ;
        }
 

Это не сработало, потому что второй цикл for, который я использовал, сравнивает элемент первого списка с каждым из второго списка, поэтому он добавляет все элементы.Даже те, которые мне не нужны. Это довольно очевидно, потому что объект из первого списка должен быть таким же, как и все элементы второго списка, чтобы это работало. Я не мог найти правильного решения.

Комментарии:

1. Привет, можем ли мы узнать, какой метод возвращает все предметы, присвоенные его области обучения, а какой метод возвращает предметы, уже присвоенные учащемуся?

Ответ №1:

Есть два возможных решения, я рекомендую второе, поскольку оно более эффективно в вычислительном отношении.

Предварительное условие:

Для обоих решений вам нужно будет сначала переопределить методы equals() and hashCode() .

Решение 1 (более короткий код):

     for (Predmet vPredmet : this.loggedStudent.getOdbor().getPredmety()) {
            if (!this.loggedStudent.getPredmety().contains(vPredmet)) {
                dostupnePredmety.add(vPredmet);
            }
    }
 

Решение 2 (наиболее эффективное с точки зрения вычислений):

     Set<Predmet> set = new HashSet<>();
    for (Predmet predmety: this.loggedStudent.getPredmety()) {
        set.add(predmety);
    }
    for (Predmet vPredmet : this.loggedStudent.getOdbor().getPredmety()) {
            if (!set.contains(vPredmet)) {
                dostupnePredmety.add(vPredmet);
            }
    }