0

抱歉,这已经完成了,但我真的很难实现这个问题的解决方案,而且我对 Java 还是很陌生。

我需要能够调用一个基本上允许将 Person 对象添加到列表中的方法。该方法需要检查该人是否已经在列表中。它需要按名字执行检查 - 我知道实际上这看起来很愚蠢,但在这种特定情况下我需要能够做到这一点。

然后该列表需要对类可用,以便稍后可以调用 print list of names 方法。

我在尝试实施解决方案时遇到的主要问题是“ConcurrentModificationException”,这是可以理解的,因为我一直在尝试在每个循环的中间更新列表。

因此,我提出了以下解决方案来防止“ConcurrentModificationException”,但我的解决方案无法正常工作并且似乎过于复杂 - 请参阅以下方法代码片段:

public void addPerson(Person aPerson) {
    // tempPersons list for temporarily storing Person objects
    tempPersons = new ArrayList<>();

    // if persons list is initially empty, add aPerson object to it
    if (persons.isEmpty()) {
        persons.add(aPerson);
    }
    // if persons list is not initially empty
    if (!persons.isEmpty()) {
        // loop through persons list
        for (Person anotherPerson : persons) {
            // if persons list anotherPerson first name is the same as the aPerson first name, print message
            if (anotherPerson.getFirstName().equals(aPerson.getFirstName())) {
                System.out.println("The Person " + aPerson.getFirstName() +
                        " is already entered in the list");
            }
            // otherwise add the aPerson object to the tempPersons list
            else {
                tempPersons.add(aPerson);
            }
        }
        // once out of loop, add the tempPersons list to the racers list
        persons.addAll(tempPersons);
        // create new tempPersons2 list based on a hashset of the persons list so there are no duplicates
        List<Person> tempPersons2 = new ArrayList<>(
                new HashSet<>(persons));
        // assign tempPersons2 list without duplicates to persons list
        persons = tempPersons2;
    }
}

因此,例如,如果我使用唯一和重复对象(aPerson 参数)的混合分别调用上述 addPerson 方法 4 次,则该方法正确识别那里已经有一个具有相同名字的对象,但人员列表似乎总是最终在那里有一个重复的对象(名字),例如,如果我有以下对象:

Person1 名字 = Bob

Person2 名字 = Jan

Person3 名字 = Bob

Person4 名字 = Ann

然后我分别调用以下方法 4 次:

addPerson(Person1);

addPerson(Person2);

addPerson(Person3);

addPerson(Person4);

当我调用打印方法时,我得到以下输出:

人 Bob 已在列表中输入

鲍勃

鲍勃

我期望以下内容:

人 Bob 已在列表中输入

鲍勃

为所有的华夫饼道歉,对你们大多数人来说,这可能是一个非常简单的解决方案,但我已经坚持了几天。如果有人可以根据我提供的示例提供一个简单的解决方案,将不胜感激?

可以在此处找到类似的文章,但我仍在苦苦挣扎。

在迭代期间向集合中添加元素

4

2 回答 2

0

您可以使用 Set 而不是 list 这将满足您的需要并实现比较器或可比较的接口以进行人员比较

于 2022-03-03T19:12:01.830 回答
0

无需过多更改代码:

  public void addPerson(Person person) {
    // The guard is more or less a premature optimization and should be removed.
    if (persons.isEmpty()) {
      persons.add(person);
      return;
    }

    for (Person anotherPerson : persons) {
      if (anotherPerson.getFirstName().equals(person.getFirstName())) {
        System.out.println("The Person " + person.getFirstName() +
            " is already entered in the list");
        return;
      }
    }
    persons.add(person);
  }

这将在找到匹配项时退出该方法,如果没有匹配项,person则在循环之后简单地添加。请注意return第一次检查中的 。

此代码的优化可能是使用MaporSet来加速包含检查;也只是使用anyMatchpersons导致更优雅的解决方案。

重复是由您的for循环及其else条件引起的。如果BobandJan在您的集合中并且您添加了第二个BobthenJan将不等于Bob并且您的else路径被执行添加一个副本到您的 final persons List

于 2022-03-03T19:17:14.113 回答