Java 从ArrayList中删除大小写匹配的名称无效
我正在尝试编写一个程序,如果名称具有特定值,则该程序将从Java 从ArrayList中删除大小写匹配的名称无效,java,list,algorithm,for-loop,arraylist,Java,List,Algorithm,For Loop,Arraylist,我正在尝试编写一个程序,如果名称具有特定值,则该程序将从ArrayList中删除名称,但我无法执行此操作 class UserNamesTest { public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add("John"); names.add("Jerry"); na
ArrayList
中删除名称,但我无法执行此操作
class UserNamesTest {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("John");
names.add("Jerry");
names.add("Jim");
names.add("Todd");
for(String name : names) {
if(name.equals("John")) {
System.out.println("true");
names.remove(names.indexOf(name));
}
}
}
}
如何完成此操作?使用迭代器不要对正在迭代的
列表进行操作:
Iterator<String> iterator = names.iterator();
while(iterator.hasNext()) {
String name iterator.next();
if(name.equals("John")) {
System.out.println("true");
iterator.remove();
}
}
Iterator Iterator=names.Iterator();
while(iterator.hasNext()){
字符串名迭代器.next();
如果(名称等于(“约翰”)){
System.out.println(“真”);
iterator.remove();
}
}
,因为当对象的并发修改不允许时,检测到该修改的方法可能会引发此异常。
在列表上使用removeIf
ArrayList<String> names = new ArrayList<>();
names.add("John");
names.add("Jerry");
names.add("Jim");
names.add("Todd");
names.removeIf(name->name.equals("John"));
请注意,Iterator.remove()
是在迭代过程中修改集合的唯一安全方法。除了使用Iterator
,在java-8中,您还可以执行以下操作:
names = names.stream()
.collect(Collectors.partitioningBy(e->e.equals("John")))
.get(false);
或更易于通过过滤器读取
names = names.stream()
.filter(e->e.equals("John"))
.collect(Collectors.toList());
使用Java8或Java11,您可以:
class UserNamesTest {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("John");
names.add("Jerry");
names.add("Jim");
names.add("Todd");
List<String> namesWithoutJohn = names.stream()
.filter(((Predicate<String>)("John"::equals)).negate()) // Java 8
// .filter(Predicate.not("John"::equals)) // Java 11
.collect(Collectors.toList());
}
}
classusernamestest{
公共静态void main(字符串[]args){
ArrayList name=新的ArrayList();
姓名。添加(“约翰”);
名称。添加(“杰瑞”);
姓名。添加(“吉姆”);
名称。添加(“Todd”);
列出不带john=names.stream()的名称
.filter(((谓词)(“John”::等于”).negate()//Java8
//.filter(Predicate.not(“John”::equals))//Java 11
.collect(Collectors.toList());
}
}
使用索引在列表上迭代以删除项目时要小心。因为项目在移动后会发生移动,所以您可能会错过其中一些项目。以下是一个例子:
ArrayList<String> names = new ArrayList<>();
names.add("Jerry");
names.add("Jim");
names.add("John");
names.add("John");
names.add("Todd");
for(int i = 0; i < names.size(); i++) {
String name = names.get(i);
if(name.equals("John")) {
names.remove(i);
}
}
names.forEach(System.out::println);
但我更喜欢使用以下方法:
names.removeIf(name->name.equals("John"));
一句话就能把所有问题都解决。这能回答你的问题吗?为了避免在自己的代码中进行迭代,我宁愿使用过滤器,这种方式是不可读的。此外,在创建包含我们想要的元素和其他元素的映射列表时会有开销。
ArrayList<String> names = new ArrayList<>();
names.add("Jerry");
names.add("Jim");
names.add("John");
names.add("John");
names.add("Todd");
for(int i = 0; i < names.size(); i++) {
String name = names.get(i);
if(name.equals("John")) {
names.remove(i);
}
}
names.forEach(System.out::println);
Jerry
Jim
John <-- wasn't removed
Todd
names = new ArrayList<>();
names.add("Jerry");
names.add("Jim");
names.add("John");
names.add("John");
names.add("Todd");
for (int i = names.size() -1; i >= 0; i--) {
String name = names.get(i);
if(name.equals("John")) {
names.remove(i);
}
}
names.forEach(System.out::println);
Jerry
Jim
Todd
names.removeIf(name->name.equals("John"));