在 Java 中拼接 arraylist 并将第二部分分组
Splice arraylist in Java and group the second part
我有一个 Dto 列表,由 'userName' 和 'skills' 组成。例如:
用户名:"John",技能:5
如果有超过 5 个元素(即 5 个用户),我想保留前五个,并将另一个分组在一个名称('Others')和一项技能(所有技能的总和)下技能)。我想到了使用 sublist 方法,创建两个临时数组,将第二个数组的 dto 分组并合并到主 Arraylist 中。
这是我的代码,但它不起作用。为什么?
final List<MyDto> usersData = mydao.getUsers();
List<MyDto> result = new ArrayList<MyDto>();
if (usersData != null && usersData.size() > 0) {
List<MyDto> tmpFirstFiveUsers = new ArrayList<MyDto>();
List<MyDto> tmpOthers = new ArrayList<MyDto>();
if(usersData.size() > 5) {
// Save first 5 users
tmpFirstFiveUsers = usersData.subList(0, 5);
// Save others
tmpOthers = usersData.subList(5, usersData.size());
// Sum of 'others' skill
int skills = 0;
for (MyDto other : tmpOthers) {
skills += other.getSkills();
}
String other = "Altro";
MyDto emptyDto = new MyDto();
emptyDto.setUserName(other);
emptyDto.setSkills(skills);
tmpOthers.clear();
tmpOthers.add(emptyDto);
}
result.clear();
result.addAll(tmpFirstFiveUsers);
result.addAll(tmpOthers);
更新:
我不能正确地做子列表,它不起作用。
我也举个例子来理解:
用户数据:
- 用户名:"a",技能:“2”
- 用户名:"b",技能:“1”
- 用户名:"c",技能:“5”
- 用户名:"d",技能:“5”
- 用户名:"e",技能:“5”
- 用户名:"f",技能:“5”
- 用户名:"g",技能:“5”
- 用户名:"h",技能:“5”
- 用户名:"i",技能:“5”
我期望的是:
用户数据:
- 用户名:"a",技能:“2”
- 用户名:"b",技能:“1”
- 用户名:"c",技能:“5”
- 用户名:"d",技能:“5”
- 用户名:"e",技能:“5”
- 用户名:"Others",技能:“20”
作为列表的 List#sublist()
returns 视图,因此在子列表中执行的所有修改都反映在该 "parent" 列表中。这就是为什么你会得到意想不到的结果。要安全地操作子列表,您应该 copy items:
tmpFirstFiveUsers = new ArrayList<>(usersData.subList(0, 5));
tmpOthers = new ArrayList<>(usersData.subList(5, usersData.size()));
我有一个 Dto 列表,由 'userName' 和 'skills' 组成。例如: 用户名:"John",技能:5
如果有超过 5 个元素(即 5 个用户),我想保留前五个,并将另一个分组在一个名称('Others')和一项技能(所有技能的总和)下技能)。我想到了使用 sublist 方法,创建两个临时数组,将第二个数组的 dto 分组并合并到主 Arraylist 中。 这是我的代码,但它不起作用。为什么?
final List<MyDto> usersData = mydao.getUsers();
List<MyDto> result = new ArrayList<MyDto>();
if (usersData != null && usersData.size() > 0) {
List<MyDto> tmpFirstFiveUsers = new ArrayList<MyDto>();
List<MyDto> tmpOthers = new ArrayList<MyDto>();
if(usersData.size() > 5) {
// Save first 5 users
tmpFirstFiveUsers = usersData.subList(0, 5);
// Save others
tmpOthers = usersData.subList(5, usersData.size());
// Sum of 'others' skill
int skills = 0;
for (MyDto other : tmpOthers) {
skills += other.getSkills();
}
String other = "Altro";
MyDto emptyDto = new MyDto();
emptyDto.setUserName(other);
emptyDto.setSkills(skills);
tmpOthers.clear();
tmpOthers.add(emptyDto);
}
result.clear();
result.addAll(tmpFirstFiveUsers);
result.addAll(tmpOthers);
更新: 我不能正确地做子列表,它不起作用。 我也举个例子来理解: 用户数据:
- 用户名:"a",技能:“2”
- 用户名:"b",技能:“1”
- 用户名:"c",技能:“5”
- 用户名:"d",技能:“5”
- 用户名:"e",技能:“5”
- 用户名:"f",技能:“5”
- 用户名:"g",技能:“5”
- 用户名:"h",技能:“5”
- 用户名:"i",技能:“5”
我期望的是: 用户数据:
- 用户名:"a",技能:“2”
- 用户名:"b",技能:“1”
- 用户名:"c",技能:“5”
- 用户名:"d",技能:“5”
- 用户名:"e",技能:“5”
- 用户名:"Others",技能:“20”
作为列表的 List#sublist()
returns 视图,因此在子列表中执行的所有修改都反映在该 "parent" 列表中。这就是为什么你会得到意想不到的结果。要安全地操作子列表,您应该 copy items:
tmpFirstFiveUsers = new ArrayList<>(usersData.subList(0, 5));
tmpOthers = new ArrayList<>(usersData.subList(5, usersData.size()));