#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);
}
}