检查数组是否包含值,如果没有则添加到arraylist - 并发修改异常 - Java

时间:2016-05-06 15:51:55

标签: java arrays iterator

我将String name传递给方法,如果name不在数组中,则会添加它。

  

我首先尝试了这个,但得到了并发修改例外

List<String> people = new ArrayList<>();

public void addName(String name) {
    if (people.isEmpty()) {
        people.add(name);
    } else {
        for (String s : people) {
            if (s.equals(name)) {
                System.out.println("dont add");
            } else {
                people.add(name);
            }
        }
    }
}

在论坛上阅读后,我了解到你必须使用迭代器来避免这种情况。我尝试了它并修复了Concurrent Modification Exception,但即使我声明如果它们存在于数组中也不会被添加,播放器会被添加,当我传递已存在的名称时,我确实得到了这个输出“name exists”列表,但它然后运行“添加名称”,所以不明白为什么会发生这种情况

if (people.isEmpty()) {
    people.add(name);
} else {
    String name2 = null;
    for (Iterator<String> it = people.iterator(); it.hasNext(); ) {
        String element = it.next();
        if (element.equals(name)) {
            String message = "name exists";
            System.out.println(message);
            name2 = null;
        } else if (!element.equals(name)) {
            System.out.println("Name added");
            name2 = name;
        }
    }
    if (name2 != null) {
        people.add(name2);
    }
}

3 个答案:

答案 0 :(得分:3)

您可以通过以下方式完成:

public void addName(String name) {
    if (!people.contains(name)) {
        people.add(name);
    }
}

答案 1 :(得分:1)

听起来你正试图重新发明一套。

List<Country> myList;

如果您想要印刷品

Double distance

答案 2 :(得分:0)

我认为一旦你发现这个名字已经存在,就需要突破你的循环。否则,name2可能会设置为null,然后再次设置为非空值。

例如:

           for (Iterator<String> it = people.iterator(); it.hasNext(); ) {
                String element = it.next();
                if (element.equals(name)) {
                    String message = "name exists";
                    System.out.println(message);
                    name2 = null;
                    break;
                } else if(element.equals(name)==false) {
                    System.out.println("Name added");
                    name2 = name;
                }
            }

但请查看contains,因为这是一种更清洁的方法!