在没有迭代的情况下从Java ArrayList中删除

时间:2018-03-28 01:43:07

标签: java arraylist

我正在完成一项任务,但我无法找到使这项工作正常的方法。我有一个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次调用触发。

4 个答案:

答案 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)

myRosterListStudent个对象。 List containsremove仅针对相似的对象,而不是String值 - 它不知道如何将StringStudent匹配}。

作为替代方案,您可以使用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()));