Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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_Arraylist - Fatal编程技术网

无需迭代即可从Java ArrayList中删除

无需迭代即可从Java ArrayList中删除,java,arraylist,Java,Arraylist,我正在做一项作业,我找不到一种方法使它正常工作。我有一个关于5个学生的列表。我需要构造一个方法来移除其中一个对象,但我不需要/不想要迭代,因为它是静态移除。我有以下代码: import java.util.ArrayList; import java.lang.String; public class Roster { static ArrayList<Student> myRoster = new ArrayList<>(); public static void

我正在做一项作业,我找不到一种方法使它正常工作。我有一个关于5个学生的列表。我需要构造一个方法来移除其中一个对象,但我不需要/不想要迭代,因为它是静态移除。我有以下代码:

import java.util.ArrayList;
import java.lang.String; 

public class Roster {
static ArrayList<Student> myRoster = new ArrayList<>();

public static void main(String[] args){

//Add Student Data
    Roster.add("1","John","Smith");
    add("2","Suzan","Erickson");
    add("3","Jack","Napoli");
    add("4","Erin","Black");
    add("5","Jason","Rapp");

remove("3");
remove("3");

}

public static void add(String studentID, String fName, String lName){
    Student newStudent = new Student(studentID, fName, lName);
myRoster.add(newStudent);
}

public static void remove(String studentID){
    if (myRoster.contains(studentID)){
        Roster.remove(studentID);
    }
    else {
        System.out.println("This student ID does not exist.");
    }
}
import java.util.ArrayList;
导入java.lang.String;
公共班级名册{
静态ArrayList MyFloster=新ArrayList();
公共静态void main(字符串[]args){
//添加学生数据
名册。添加(“1”、“约翰”、“史密斯”);
添加(“2”、“苏姗”、“埃里克森”);
添加(“3”、“杰克”、“那不勒斯”);
添加(“4”、“艾琳”、“黑色”);
添加(“5”、“Jason”、“Rapp”);
删除(“3”);
删除(“3”);
}
公共静态void add(字符串studentID、字符串fName、字符串lName){
学生新闻学生=新学生(学生ID、fName、lName);
我的花名册.add(newStudent);
}
公共静态无效删除(字符串studentID){
if(我的花名册包含(学生ID)){
名册。删除(学生ID);
}
否则{
System.out.println(“此学生ID不存在。”);
}
}

当我编译代码时,没有一个条目被删除,并且
else
语句为这两个
remove
调用触发。

听起来似乎您应该使用映射而不是列表,例如

Map<Integer, Student> sMap = new HashMap<>();
sMap.put(1, new Student("1", "John","Smith"));
sMap.put(2, new Student("2", "Suzan","Erickson"));
sMap.put(3, new Student("3", "Jack","Napoli"));
sMap.put(4, new Student("4", "Erin","Black"));
sMap.put(5, new Student("5", "Jason","Rapp"));
ArrayList.contains(Object)
。remove(Object)
使用
Object.equals
迭代整个列表并查找对象。因此

  • 如果您坚持使用
    ArrayList
    ,您应该覆盖
    Student
    equals
    方法,以及
    hashCode
    方法,使它们只使用
    studentId
    。您还应该修改
    花名册。删除
    方法,使其调用
    mylotster.contains
    ,而不是再次调用自身n
  • 在表面之下,它仍然是迭代的

mylotister
学生对象的
列表。
列表
包含
删除
将只对类似的对象有效,而不是
字符串
值-它不知道如何将
字符串
学生
匹配

或者,您可以使用
列表
支持和
过滤器
列表
来查找与
学生ID
匹配的元素,然后删除所有这些元素,例如

public static void remove(String studentID) {
    List<Student> matches = myRoster.stream().filter(student -> student.getStudentID().equals(studentID)).collect(Collectors.toList());
    myRoster.removeAll(matches);
}
publicstaticvoidremove(stringstudentid){
列表匹配项=mylotster.stream().filter(student->student.getStudentID().equals(studentID)).collect(Collectors.toList());
我的花名册。删除所有(比赛);
}
但我不需要/想要迭代


正如您所理解的,仍然有一个迭代被执行,只是您自己没有这样做,API偏离了程序员的答案,没有理由打开您自己的流来收集学生,以便在您可以调用Collection的removeIf时将其删除

myRoster.removeIf(s -> studentID.equals(s.getstudentID()));

我的花名册
是一个
学生
的列表,但是
学生ID
是一个
字符串
,你不能用这种方式使用
包含
删除
,你需要循环浏览
列表
并找到匹配的记录。“但我不需要/想要迭代”-哦,是的,您的列表包含
Student
对象而不是
String
对象-请参阅下面的@Tim answer以使用
Map
您正在添加一个Student对象,并在对象集合中搜索arrayList a值,这是错误的…
List matches=mylotster.stream().filter(Student->.getStudentID().equals(studentID)).collect(Collectors.toList());
将返回一个
列表,其中
学生的ID与请求的ID匹配-然后您可以使用
我的花名册.removeAll(matches);
删除它们。我没有包括所有相关的代码(因为“电子邮件地址”、年龄和年级对这个问题都不重要),但作业明确要求使用ArrayList。@JasonRapp很公平,但对于现实世界的解决方案,映射可能是更好的选择。无论如何,其他答案解决了列表删除问题。感谢您的帮助。由于我们正在摆脱
if/else
语句,我假设我必须为
remove(“3”);
调用的第二次迭代,对吗?@JasonRapp不是真的,第二次调用将生成一个
matches
,它是空的-当然,如果您想显示错误,您可以检查
matches
myRoster.removeIf(s -> studentID.equals(s.getstudentID()));