[英]check if array contains values, if not then add to arraylist - Concurrent Modification Exception - Java
我正在将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 exist” ,但是它也会同时运行“已添加名称”,所以不明白为什么会这样
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);
}
}
您可以通过以下方式简单地做到这一点:
public void addName(String name) {
if (!people.contains(name)) {
people.add(name);
}
}
听起来您正在尝试重新创造一套。
Set<String> names = new TreeSet<>(); // Or set of your choice
names.add("Joe"); // Set contents ["Joe"]
names.add("Bob"); // Set contents ["Joe", "Bob"];
names.add("Joe"); // Set contents ["Joe", "Bob"];
如果您想要打印线
if (names.add(name) {
System.out.println("Added name " + name);
} else {
System.out.println("Already added " + name);
}
我认为一旦发现名称已经存在,就需要打破循环。 否则, name2
可能会设置为null
,然后再次设置为非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
因为这是一种更清洁的方法!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.