Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从ArrayList中删除大小写匹配的名称无效_Java_List_Algorithm_For Loop_Arraylist - Fatal编程技术网

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"));