我有一个Dto列表,由' userName'组成。和'技能'。例如: userName:" John",技能:5
如果有超过5个元素(因此有5个用户),我希望保持前五名,并将另一个用一个名称('其他')和一个技能组合(所有技能的总和)。我想到使用子列表方法,创建两个临时数组,将第二个数组的dto分组并在主Arraylist中合并all。 这是我的代码,但它不起作用。为什么呢?
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);
更新: 我无法正确执行子列表,但它无法正常工作。 我还举一个例子来理解: usersData:
我的期望是: usersData:
答案 0 :(得分:0)
由于List#sublist()
返回列表的视图,因此在子列表中执行的所有修改都会反映在该“父”列表中。这就是为什么你得到不可预知的结果。要安全地操作子列表,您应复制项目:
tmpFirstFiveUsers = new ArrayList<>(usersData.subList(0, 5));
tmpOthers = new ArrayList<>(usersData.subList(5, usersData.size()));