Java 使用条件更新arraylist

Java 使用条件更新arraylist,java,arraylist,Java,Arraylist,我有一门主法课。方法addStudents()只是将student添加到students数组列表中。但此方法在rollnumber属性上添加空值 另一种方法addRollNumber()应该在students arraylist中添加卷号,如果students arraylist中已经存在要添加的学生idNumber,则卷号应该相同 就像在本例中,两名学生maria和smriti拥有相同的ID号,即145。现在,更新后的arraylist应该具有相同的rollNumber。我怎样才能做到这一点

我有一门主法课。方法
addStudents()
只是将student添加到students数组列表中。但此方法在rollnumber属性上添加空值

另一种方法
addRollNumber()
应该在students arraylist中添加卷号,如果students arraylist中已经存在要添加的学生idNumber,则卷号应该相同

就像在本例中,两名学生maria和smriti拥有相同的ID号,即145。现在,更新后的arraylist应该具有相同的rollNumber。我怎样才能做到这一点

public class RollNoGenerator {


    List<Student> students = new ArrayList<>();

    List<Student> newList = new ArrayList<>();

    public static void main(String[] args) {

        RollNoGenerator rollNoGenerator = new RollNoGenerator();
        rollNoGenerator.addStudents();
        rollNoGenerator.addRollNumber();
        rollNoGenerator.pritnList();  
    }

   //this method currently is not producing the required output
    public void addRollNumber() {

        Iterator itr = students.iterator();

        while(itr.hasNext()) {
            Student std = (Student) itr.next();
            if(newList.contains(std.getIdNumber())) {
                std.setRollNumber("1");
                newList.add(std);


            }else {
                newList.add(std);
            }
        }
    }

    public void addStudents() {
        Student student = new Student("bob","123","new york","red",null);
        Student student1 = new Student("ben","125","london","blue",null);
        Student student2 = new Student("maria","145","brisbane","pink",null);
        Student student3 = new Student("smriti","145","portland","brinjal",null);
        students.add(student);
        students.add(student1);
        students.add(student2);
        students.add(student3);

    }


    public void pritnList() {
        for(Student s : newList) {
            System.out.println(s.getName());
            System.out.println(s.getRollNumber());
        }
    }

}

在类中添加一个
rollNumber
计数器

private int nextRollNumber = 1;
然后以这种方式修改您的
addRollNumber
方法(参见内联注释)


根据学生的
idNumber
as将学生分组

Map<String, List<Student>> idNumberToStudentsMap = students
            .stream()
            .collect(Collectors.groupingBy(Student::getIdNumber));
其中,
currentRollNumber
是分配给具有特定
idNumber
的所有学生的卷号


Java 7版本相同

Map<String, List<Student>> idNumberToStudentsMap = new HashMap<>();
for (Student student : students) {
    if (!idNumberToStudentsMap.containsKey(student.getIdNumber())) {
        idNumberToStudentsMap.put(student.getIdNumber(), new ArrayList<>());
    }
    idNumberToStudentsMap.get(student.getIdNumber()).add(student);
}
AtomicInteger rollNumberProvider = new AtomicInteger(0);

for(Map.Entry<String, List<Student>> entry : idNumberToStudentsMap.entrySet()) {
    String currentRollNumber = String.valueOf(rollNumberProvider.incrementAndGet());
    //All these students have the same idNumber
    List<Student> studentsWithSameId = entry.getValue();
    for (Student student : studentsWithSameId) {
        student.setRollNumber(currentRollNumber);
    }
}
Map idNumberToStudentsMap=newhashmap();
用于(学生:学生){
如果(!idNumberToStudentsMap.containsKey(student.getIdNumber())){
idNumberToStudentsMap.put(student.getIdNumber(),newArrayList());
}
idNumberToStudentsMap.get(student.getIdNumber()).add(student);
}
AtomicInteger rollNumberProvider=新的AtomicInteger(0);
对于(Map.Entry:idNumberToStudentsMap.entrySet()){
String currentRollNumber=String.valueOf(rollNumberProvider.incrementAndGet());
//所有这些学生都有相同的ID号
List studentsWithSameId=entry.getValue();
适用于(学生:studentsWithSameId){
student.setRollNumber(当前RollNumber);
}
}

为什么要为所有的卷设置相同的卷号?或者,你想让它自动递增吗?这是我的要求。我想让那些拥有相同ID号的人拥有相同的卷号。其余的呢?1,2,3.. 等等?是的,rest应该是增量的。如果不使用lamda表达式,就没有办法做到这一点吗?因为我需要在Java7上工作。当然,我会的modify@sagar给你:)让我看看是否可行。我将投票并接受这个答案。如果你的学生人数真的很大,有很多方法可以通过将每个
idNumber/rollNumber
对存储在地图中来优化它。这将避免在每次迭代时都要通过
newList
bob
1
ben
2
maria
3
smriti
3
Map<String, List<Student>> idNumberToStudentsMap = students
            .stream()
            .collect(Collectors.groupingBy(Student::getIdNumber));
AtomicInteger rollNumberProvider = new AtomicInteger(0);
idNumberToStudentsMap.forEach((key, value) -> {
        String currentRollNumber = String.valueOf(rollNumberProvider.incrementAndGet());
        value.forEach(student -> student.setRollNumber(currentRollNumber));
    });
Map<String, List<Student>> idNumberToStudentsMap = new HashMap<>();
for (Student student : students) {
    if (!idNumberToStudentsMap.containsKey(student.getIdNumber())) {
        idNumberToStudentsMap.put(student.getIdNumber(), new ArrayList<>());
    }
    idNumberToStudentsMap.get(student.getIdNumber()).add(student);
}
AtomicInteger rollNumberProvider = new AtomicInteger(0);

for(Map.Entry<String, List<Student>> entry : idNumberToStudentsMap.entrySet()) {
    String currentRollNumber = String.valueOf(rollNumberProvider.incrementAndGet());
    //All these students have the same idNumber
    List<Student> studentsWithSameId = entry.getValue();
    for (Student student : studentsWithSameId) {
        student.setRollNumber(currentRollNumber);
    }
}