用Java拼接arraylist并将第二部分分组
我有一个Dto列表,由“用户名”和“技能”组成。例如: 用户名:“John”,技能:5 如果有5个以上的元素(因此有5个用户),我希望保留前五名,并将其他元素归为一个名称(“其他”)和一个技能(所有技能的总和)。我考虑使用sublist方法,创建两个临时数组,将第二个数组的dto分组,并将所有数据合并到主Arraylist中。 这是我的代码,但不起作用。为什么?用Java拼接arraylist并将第二部分分组,java,arraylist,sublist,Java,Arraylist,Sublist,我有一个Dto列表,由“用户名”和“技能”组成。例如: 用户名:“John”,技能:5 如果有5个以上的元素(因此有5个用户),我希望保留前五名,并将其他元素归为一个名称(“其他”)和一个技能(所有技能的总和)。我考虑使用sublist方法,创建两个临时数组,将第二个数组的dto分组,并将所有数据合并到主Arraylist中。 这是我的代码,但不起作用。为什么? final List<MyDto> usersData = mydao.getUsers(); List<MyDto
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);
final List usersData=mydao.getUsers();
列表结果=新建ArrayList();
if(usersData!=null&&usersData.size()>0){
List tmpFirstFiveUsers=new ArrayList();
List tmpOthers=new ArrayList();
如果(usersData.size()>5){
//保存前5个用户
tmpFirstFiveUsers=usersData.subList(0,5);
//救人
tmpOthers=usersData.subList(5,usersData.size());
//“他人”技能的总和
智力技能=0;
对于(MyDto其他:TMPOTTHERS){
skills+=other.getSkills();
}
字符串other=“Altro”;
MyDto emptyDto=新的MyDto();
emptyDto.setUserName(其他);
清空。设置技能(技能);
tmpOthers.clear();
tmpOthers.add(emptyDto);
}
result.clear();
结果.addAll(tmpFirstFiveUsers);
结果:addAll(tmpOthers);
更新:
我无法正确执行子列表,它不工作。
我还举了一个例子来理解:
用户数据:
- 用户名:“a”,技能:“2”
- 用户名:“b”,技能:“1”
- 用户名:“c”,技能:“5”
- 用户名:“d”,技能:“5”
- 用户名:“e”,技能:“5”
- 用户名:“f”,技能:“5”
- 用户名:“g”,技能:“5”
- 用户名:“h”,技能:“5”
- 用户名:“我”,技能:“5”
- 用户名:“a”,技能:“2”
- 用户名:“b”,技能:“1”
- 用户名:“c”,技能:“5”
- 用户名:“d”,技能:“5”
- 用户名:“e”,技能:“5”
- 用户名:“其他”,技能:“20”
tmpFirstFiveUsers = new ArrayList<>(usersData.subList(0, 5));
tmpOthers = new ArrayList<>(usersData.subList(5, usersData.size()));
tmpFirstFiveUsers=newarraylist(usersData.subList(0,5));
tmpOthers=newarraylist(usersData.subList(5,usersData.size());
它不起作用
-记住要具体说明这一点。你得到了什么?你期望得到什么,如果可能的话,举个例子?最后3条语句应该在if
条件中,否则tmpFirstFiveUsers
和tmpOthers
将是空列表。顺便说一句,如果你的列表包含5个或更少的用户tmpFirstFiveUsers
将为空-至少您的代码表明了这一点。更正您的代码,并在有5个或更少用户或超过5个用户时处理这两种情况。您的示例仍然不完整。您的代码得到了什么?请记住,子列表由原始列表支持,因此“tmpOthers.clear();`将从usersData
中删除所有相应的条目。如果不想这样做,请创建新列表并将子列表作为构造函数参数传递。