更新条件为

时间:2018-03-05 10:33:55

标签: java arraylist

我有一个主要方法的课程。方法addStudents()只是将学生添加到学生的arraylist中。但是此方法在rollnumber属性上添加空值。

另一种方法addRollNumber()应该在学生arraylist上添加滚动号码,使得如果要添加的学生的idNumber已经存在于学生arraylist中,他们的滚动号码应该相同。

就像在这种情况下,两个学生玛丽亚和smriti具有相同的idNumber,即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());
        }
    }

}

Student.java

public class Student {

    private String name;
    private String idNumber;
    private String address;
    private String dressColor;
    private String rollNumber;




    public Student() {

    }
    public Student(String name, String idNumber, String address, String 
    dressColor, String rollNumber) {
        super();
        this.name = name;
        this.idNumber = idNumber;
        this.address = address;
        this.dressColor = dressColor;
        this.rollNumber = rollNumber;
    }

           //getter setters ...............//

2 个答案:

答案 0 :(得分:1)

向您的班级添加rollNumber个人

private int nextRollNumber = 1;

然后以这种方式修改addRollNumber方法(参见内联评论)

public void addRollNumber() {

  Iterator itr = students.iterator();

  Map<String, String> IdRollNumberPairs = new HashMap<>();
  while(itr.hasNext()) {
    Student std = (Student) itr.next();

    // Look for an other student with the same idNumber in the list
    String rollNumber = IdRollNumberPairs.get(std.getIdNumber());

    // if there is one, copy his rollNumber
    if(rollNumber != null) {
      std.setRollNumber(rollNumber);

    // if not then pick a new roll number
    } else {
      std.setRollNumber(String.valueOf(nextRollNumber));
      IdRollNumberPairs.put(std.getIdNumber(), std.getRollNumber());
      nextRollNumber++;
    }

    // Add student to the list
    newList.add(std);
  }
}

打印出来:

bob
1
ben
2
maria
3
smriti
3

答案 1 :(得分:0)

将学生按idNumber分组为

Map<String, List<Student>> idNumberToStudentsMap = students
            .stream()
            .collect(Collectors.groupingBy(Student::getIdNumber));

现在,idNumberToStudentsMap让所有学生在一个地图条目中分组(作为一个列表)idNumber。因此,为了满足您的要求,必须为每个条目中的所有学生分配相同的rollNumber。

将rollNumber指定为

AtomicInteger rollNumberProvider = new AtomicInteger(0);
idNumberToStudentsMap.forEach((key, value) -> {
        String currentRollNumber = String.valueOf(rollNumberProvider.incrementAndGet());
        value.forEach(student -> student.setRollNumber(currentRollNumber));
    });

其中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);
    }
}