java #arraylist
#java #arraylist
Вопрос:
Я пытаюсь сгенерировать любое количество семейств, используя цикл For, эти семейства сохраняются в ArrayList. Но когда я выбираю, например, создать 1 семейство, я получаю два идентичных семейства в ArrayList, хотя у меня есть метод сохранения только уникальных семейств.
//Code for generating families
public static void firstOption(int count) {
ArrayList<String> womanNames = new ArrayList<>(List.of("Name1", "Name2", "Name3", "Irina"));
ArrayList<String> manNames = new ArrayList<>(List.of("Name1", "Name2", "Name3", "Name4"));
ArrayList<String> surnames = new ArrayList<>(List.of("Surname1", "Surname2", "Surname3", "Surname4"));
ArrayList<Integer> iq = new ArrayList<>(List.of(80, 100, 120, 90));
long minDay = LocalDate.of(1970, 1, 1).toEpochDay();
long maxDay = LocalDate.of(2015, 12, 31).toEpochDay();
long randomDay = ThreadLocalRandom.current().nextLong(minDay, maxDay);
LocalDate randomDate = Instant.ofEpochMilli(randomDay).atZone(ZoneId.systemDefault()).toLocalDate();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
for (int i = 0; i < count; i ) {
int indexManName = (int) (Math.random() * manNames.size());
int indexWomanName = (int) (Math.random() * manNames.size());
int indexSurname = (int) (Math.random() * surnames.size());
int indexIq = (int) (Math.random() * iq.size());
Man father = new Man(manNames.get(indexManName), surnames.get(indexSurname), randomDate.format(formatter), iq.get(indexIq));
Woman mother = new Woman(womanNames.get(indexWomanName), father.getSurname(), randomDate.format(formatter), iq.get(indexIq));
familyController.createNewFamily(father, mother);
}
}
//This is the code for creating and saving new Family to ArrayList
public Family saveFamily(Family family) {
int index = this.familyList.indexOf(family);
if (this.familyList.contains(family)) {
this.familyList.set(index, family);
} else {
this.familyList.add(family);
}
return family;
}
public Family createNewFamily(Human mother, Human father) {
return familyDao.saveFamily(new Family(mother, father));
}
//Override family equals
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Family myFamily))
return false;
return (mother.hashCode() == myFamily.getMother().hashCode());
}
Комментарии:
1.
if (this.familyList.contains(family))
Family
Переопределяет лиequals()
метод? Если нет, вы никогда не заставите этот метод работать правильно. Кроме того, вы можете прочитать о наборах .2. Спасибо, я знаю о наборах, но в этом случае мне нужен Arraylist. @Переопределение общедоступных логических значений equals(Object obj) { if (this == obj) возвращает true; if (!(obj instanceof Family MyFamily)) возвращает false; return (mother.hashCode() == MyFamily.getMother().hashCode()); }
3. Этот
equals()
метод определенно сломан. Вы можете найти, какequals()
иhashCode()
работать в Интернете. Также вы можете генерировать эти методы, современные IDE, такие как IDEA или Eclipse, имеют эту функцию. И не забудьте переопределитьequals()
иhashCode()
для других ваших классов (Man, Woman и т. Д.).) Также.