我一直在尝试使用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);
}
}
}
答案 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);
}