Java中的Splice arraylist和第二部分组

时间:2016-03-31 11:57:59

标签: java arraylist sublist

我有一个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:

  • userName:&#34; a&#34;,技能:&#34; 2&#34;
  • userName:&#34; b&#34;,技能:&#34; 1&#34;
  • userName:&#34; c&#34;,技能:&#34; 5&#34;
  • userName:&#34; d&#34;,技能:&#34; 5&#34;
  • userName:&#34; e&#34;,技能:&#34; 5&#34;
  • userName:&#34; f&#34;,技能:&#34; 5&#34;
  • userName:&#34; g&#34;,技能:&#34; 5&#34;
  • userName:&#34; h&#34;,技能:&#34; 5&#34;
  • userName:&#34; i&#34;,技能:&#34; 5&#34;

我的期望是: usersData:

  • userName:&#34; a&#34;,技能:&#34; 2&#34;
  • userName:&#34; b&#34;,技能:&#34; 1&#34;
  • userName:&#34; c&#34;,技能:&#34; 5&#34;
  • userName:&#34; d&#34;,技能:&#34; 5&#34;
  • userName:&#34; e&#34;,技能:&#34; 5&#34;
  • userName:&#34;其他&#34;,技能:&#34; 20&#34;

1 个答案:

答案 0 :(得分:0)

由于List#sublist()返回列表的视图,因此在子列表中执行的所有修改都会反映在该“父”列表中。这就是为什么你得到不可预知的结果。要安全地操作子列表,您应复制项目:

tmpFirstFiveUsers = new ArrayList<>(usersData.subList(0, 5));
tmpOthers = new ArrayList<>(usersData.subList(5, usersData.size()));