我有一个主要方法的课程。方法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 ...............//
答案 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);
}
}