2016-03-31 26 views
2

'userName' ve 'skills' tarafından oluşturulan bir Dto Listem var. Örneğin: userName: "John", becerileri: 5Java'da splice arraylist ve ikinci kısmı gruplandır

Beşten fazla öğe varsa (bu yüzden 5 kullanıcı) İlk beşi korumak ve diğerini bir ad altında gruplamak istiyorum ('Diğerleri') ve bir yetenek altında (tüm becerilerin toplamı). Alt liste yöntemini kullanmayı, iki geçici dizi oluşturmayı, ikinci dizinin dto'sunu gruplamayı ve ana Arraylist'te bir araya getirmeyi düşündüm. Bu benim kodum ama çalışmıyor. Niye ya?

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); 

GÜNCELLEME: Ben doğru alt listesini yapamaz , bu işe yaramaz. Ben anlamak da bir örnek vermek: usersData:

  • userName: "a", beceri: "2"
  • userName: "b" becerileri: "1"
  • userName: "c " becerileri: "5"
  • adı: "d" beceri: "5"
  • adı: "e", beceri: "5"
  • adı: "F", beceri: "5"
  • userName: "g", beceri: "5"
  • userName: "h", becerileri: "5"
  • userName: "i", becerileri: "5" Beklediğim ne

geçerli: usersData:

  • userName: "a", beceri: "2"
  • adı: "B", beceri: "1"
  • adı: "c", beceri: "5"
  • adı: "d" becerileri: "5 "
  • adı: "e", beceri: "5"
  • adı: "Diğer", beceri: "20"
+0

'o work' değil - bu konuda spesifik olması unutmayın. Ne alıyorsun? Mümkünse bir örnekle ne bekliyordunuz? – Thomas

+0

son 3 ifadesi "if" koşulu içinde olmalıdır, aksi takdirde "tmpFirstFiveUsers" ve "tmpOthers" boş listeler olur. – Braj

+0

Btw, listeniz 5 veya daha az kullanıcı içeriyorsa, 'tmpFirstFiveUsers' boş olacaktır - en azından kodunuz bunu gösterir. – Thomas

cevap

0

List#sublist() olarak döner bir görünüştür listesinin, bu nedenle tüm modifikasyonlar yapılmaktadır Bir alt liste bu "ana" listeye yansır. Bu yüzden öngörülemeyen sonuçlar elde edersiniz. güvenle sublists işletmek için, öğeleri kopyalamanız gerekir:

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

Mükemmel, şimdi çok teşekkür ederim çalışıyor! – panagulis72