2016-03-31 30 views
2

我有一個Dto列表,由'用戶名'和'技能'組成。例如: userName:「John」,skills:5拼接arraylist Java和組第二部分

如果有超過5個元素(所以5個用戶),我想保留前五位,並將另一個名稱分組在一起('其他' )和一項技能(所有技能的總和)。我想過使用子列表方法,創建兩個臨時數組,將第二個數組的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); 

更新: 我不能做正確的子表,這是行不通的。 我還舉一個例子來理解: usersData:

  • 用戶名: 「A」,技能: 「2」
  • 用戶名: 「B」,技能: 「1」
  • 用戶名:「C 」,技能: 「5」
  • 用戶名: 「d」,技能: 「5」
  • 用戶名: 「E」,技能: 「5」
  • 用戶名: 「F」,技能: 「5」
  • userName:「g」,技能:「5」
  • 用戶名: 「H」,技能: 「5」
  • 用戶名: 「我」,技能: 「5」

我的預期是什麼: usersData:

  • 用戶名: 「一」,技能: 「2」
  • 用戶名: 「b」,技能: 「1」
  • 用戶名: 「C」,技能: 「5」
  • 用戶名: 「d」,技能:「5 「
  • 用戶名: 「E」,技能: 「5」
  • 用戶名: 「其他」,技能: 「20」
+0

'不work' - 記得要具體有關。你得到了什麼?如果可能的話,你期望什麼? – Thomas

+0

最後3條語句應該在'if'條件中,否則'tmpFirstFiveUsers'和'tmpOthers'將會是空列表。 – Braj

+0

順便說一句,如果你的列表包含5個或更少的用戶'tmpFirstFiveUsers'將是空的 - 至少這就是你的代碼所表示的。 – Thomas

回答

0

作爲List#sublist()返回的視圖列表的,在如此進行的所有修改一個子列表被反映在該「父」列表中。這就是爲什麼你會得到不可預測的結果。爲了安全操作的子列表,你應該複製項目:

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

完美,非常感謝你,現在它的工作! – panagulis72