我正在完成一项任务,但我无法找到使这项工作正常的方法。我有一个ArrayList,其中包含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.");
}
}
当我编译代码时,没有任何条目被删除,并且else
语句会为remove
次调用触发。
答案 0 :(得分:2)
听起来好像你应该使用地图而不是列表,例如
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"));
然后,如果您需要从地图中删除学生,您可以使用以下一个班轮:
sMap.remove(3);
答案 1 :(得分:2)
myRoster
是List
个Student
个对象。 List
contains
和remove
仅针对相似的对象,而不是String
值 - 它不知道如何将String
与Student
匹配}。
作为替代方案,您可以使用List
Stream
支持和filter
List
来查找与studentID
匹配的元素然后删除所有这些元素,例如......
public static void remove(String studentID) {
List<Student> matches = myRoster.stream().filter(student -> student.getStudentID().equals(studentID)).collect(Collectors.toList());
myRoster.removeAll(matches);
}
但我不需要/想要迭代
只是你理解,仍然有一个迭代被执行,只是你自己没有做,API是
答案 2 :(得分:0)
ArrayList.contains(Object)
和.remove(Object)
使用Object.equals
来迭代整个列表并找到对象。所以
ArrayList
,则应覆盖equals
Student
方法和hashCode
方法,仅使用studentId
。您还应该修改Roster.remove
方法,使其调用myRoster.contains
而不是再次调用自己。答案 3 :(得分:0)
离开MadProgrammer的回答,没有理由打开自己的流来收集学生删除,当你可以打电话给Collection&lt; remove'f
myRoster.removeIf(s -> studentID.equals(s.getstudentID()));