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