Дубликаты в массиве с использованием цикла For (JAVA)

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 и т. Д.).) Также.