如何使用Java通过for循环删除ArrayList中的元素

时间:2019-12-11 14:49:03

标签: java arrays arraylist

我一直在尝试使用ArrayList对象删除remove()中的元素,但它仍然没有删除任何内容。我已经检查了存储在数组中的列表,并且一切正常,但是当我尝试删除一个元素时,它不起作用。我的目标是用户输入要删除的名称,它会搜索与该名称相同的列表并将其删除。列表数组设置为全局。

代码如下:

public static void removeStudents() {
    String removeName;

    System.out.println("******REMOVE STUDENTS******");
    System.out.print("Enter name you wish to remove: ");
    removeName = hold.nextLine();

    hold.nextLine();

    for (int x = 0; x < fullName.size(); x++) {
        if (fullName.get(x).equalsIgnoreCase(removeName)) {
            fullName.remove(x);
        }
    }       
}

3 个答案:

答案 0 :(得分:4)

从Java 8开始,就有

Collection.removeIf(Predicate<? super E> filter)

您可以轻松地从List中删除与指定条件匹配的元素,但是在迭代该列表时不应该这样做,因为它的索引会发生变化,并且可能会导致ConcurrentModificationException,如前所述问题下方的评论之一。

这样做:

public static void main(String[] args) {
    // provide sample data
    List<String> students = new ArrayList<>();
    students.add("Student 01");
    students.add("Student 02");
    students.add("Student 03");
    students.add("Student 04");
    students.add("Student 05");
    students.add("Student 06");
    // print the list once before any operation
    System.out.println("Before:\t" + String.join(", ", students));
    // remove elements matching certain criteria, here equality to "Student 03"
    students.removeIf(student -> student.equalsIgnoreCase("Student 03"));
    // print the list after removal of "Student 03"
    System.out.println("After:\t" + String.join(", ", students));
}

输出为

Before: Student 01, Student 02, Student 03, Student 04, Student 05, Student 06
After:  Student 01, Student 02, Student 04, Student 05, Student 06

请注意,该示例仅使用List<String>,如果您有List<Student>,则应指定删除标准,例如

students.removeIf(student -> student.getName().equalsIgnoreCase(removeName));

答案 1 :(得分:1)

假设您有一个带有学生姓名的字符串ArrayList,其大小为5。每当找到要删除的字符串时,在for循环的下一次迭代中,您将跳过一个ArrayList元素。您可以通过减少for循环迭代器来解决此问题,这是一个可行的解决方案,但不是最佳解决方案。 如果循环在第三个元素(fullName.get(2))上并且符合删除条件,则将其删除,现在具有4个元素而不是5个元素的ArrayList,在下一次迭代(fileName.get(3))中您实际上将跳过一个已移到已删除元素位置的ArrayList元素(整个ArrayList明显移了)。

public static void removeStudents(){
    String removeName;

    System.out.println("******REMOVE STUDENTS******");
    System.out.print("Enter name you wish to remove: ");
    removeName = hold.nextLine();

    hold.nextLine();

    for(int x=0 ; x<fullName.size() ; x++){
        if(fullName.get(x).equalsIgnoreCase(removeName)){
            fullName.remove(x);
            x--;
        }
    }       
}

这应该可行,但是正如上面的评论所述,使用Iterator会是更好的解决方案。

答案 2 :(得分:0)

public static void removeStudents(){
    String removeName;

    System.out.println("******REMOVE STUDENTS******");
    System.out.print("Enter name you wish to remove: ");
    removeName = hold.nextLine();

    hold.nextLine();

    // collecting the objects that we want to delete
    List<String> foundList = new ArrayList<String>();

    for(int x = 0; x < fullName.size();x++){
        if(fullName.get(x).equalsIgnoreCase(removeName)){
            foundList.add(fullName.get(x));
        }
    }

    // delete objects
    fullName.removeAll(foundList);
}