Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java拼接arraylist并将第二部分分组_Java_Arraylist_Sublist - Fatal编程技术网

用Java拼接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

我有一个Dto列表,由“用户名”和“技能”组成。例如: 用户名:“John”,技能:5

如果有5个以上的元素(因此有5个用户),我希望保留前五名,并将其他元素归为一个名称(“其他”)和一个技能(所有技能的总和)。我考虑使用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);
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”
As返回列表视图,因此在子列表中执行的所有修改都会反映在“父”列表中。这就是为什么您会得到不可预测的结果。要安全地操作子列表,您应该复制项:

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
中删除所有相应的条目。如果不想这样做,请创建新列表并将子列表作为构造函数参数传递。