无需迭代即可从Java ArrayList中删除
我正在做一项作业,我找不到一种方法使它正常工作。我有一个关于5个学生的列表。我需要构造一个方法来移除其中一个对象,但我不需要/不想要迭代,因为它是静态移除。我有以下代码:无需迭代即可从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
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
花名册。删除
方法,使其调用
,而不是再次调用自身nmylotster.contains
- 在表面之下,它仍然是迭代的
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()));