@Romario21

Java проблемы с сортировкой(групировкой)?

Всем привет, прошу помощи.
Задача сгруппировать пользователей по кол-ву очков:
Т.е
ArrayList list = new ArrayList<>();
list.add(new User("Иванов",2));
list.add(new User("Петров",2));
list.add(new User("Сидоров",5));
list.add(new User("Павлов",5));
list.add(new User("Ромашкин",1));

На выходе нужен вот такой HashMap:
score: 2 {Иванов,Петров}
score: 5 {Сидоров,Павлов}
score: 1 {Ромашкин}

Проблема у меня в том, что в HashSet bucket записывается только один пользователь.
Вот мой код:
//Изначальный список пользователей
        ArrayList<User> list = new ArrayList<>();
         list.add(new User("Иванов",2));
         list.add(new User("Петров",2));
         list.add(new User("Сидоров",5));
         list.add(new User("Павлов",5));
         list.add(new User("Ромашкин",1));

         //Конечный результат
         HashMap<Integer,HashSet<User>> resultMap = new HashMap<>();

         Iterator iterator = list.iterator();
         while(iterator.hasNext()){
             User item = (User) iterator.next();

     //корзина для пользователей с одинаковым кол-вом очков
             HashSet<User> bucket = new HashSet<>();
              for(int i=0;i<list.size();i++){
                  User subItem = list.get(i);
                  if(item.getLeadQualificated() == subItem.getLeadQualificated()){
                      if(bucket.add(item)){
                         System.out.println("Добавил в корзину : "+item.getLeadQualificated()+"-> "+item.getManager());
                     }

                  }
             }
           
            resultMap.put(item.getLeadQualificated(),bucket);//(key-очки, value - список пользователей с таким кол-вом очков)


         }

   //Выводим resultMap
 Iterator it = resultMap.entrySet().iterator();
         while (it.hasNext()) {
             Map.Entry entry = (Map.Entry)it.next();
             int key = (int) entry.getKey();
            System.out.println("Score: "+key);
             HashSet<User> buketUsers = (HashSet<User>) entry.getValue();
             Iterator<User> it2 = buketUsers.iterator();
             while(it2.hasNext()){
                 User user = it2.next();
                 System.out.println(user.getManager());
             }

             System.out.println("...");

         }


В консоле:

Добавил в корзину : 5-> Сидоров
Добавил в корзину : 5-> Павлов
Добавил в корзину : 2-> Иванов
Добавил в корзину : 2-> Петров
Добавил в корзину : 1-> Ромашкин
_______________________________
Score: 1
Ромашкин
...
Score: 2
Петров
...
Score: 5
Павлов
...
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
EreminD
@EreminD
Кое-что умею
Не страдайте, используйте стримАПИ
ArrayList<User> list = new ArrayList<>();
        list.add(new User("Иванов",2));
        list.add(new User("Петров",2));
        list.add(new User("Сидоров",5));
        list.add(new User("Павлов",5));
        list.add(new User("Ромашкин",1));

        //Конечный результат
        Map<Integer, List<User>> result = list.stream().collect(Collectors.groupingBy(o -> o.scores));

        //выводим результат
        result.forEach((k,v) -> {
            System.out.println("Scores: " + k);
            v.forEach(u -> System.out.println(u.name));
        });

////
Scores 1
Ромашкин
Scores 2
Иванов
Петров
Scores 5
Сидоров
Павлов
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
iLLuzor
@iLLuzor
Java, Kotlin, Android Developer
Вы каждый раз создаёте новый Set, потому там и один элемент.
Нужно проверять, если такой ключ уже существует, нужно добавить в существующий Set юзера, если нет - создавать новый Set.
Ответ написан
Комментировать
Nirail
@Nirail
Дайте мне повод и я во все решу
Проблема в этом куске:
while(iterator.hasNext()){
             User item = (User) iterator.next();

     //корзина для пользователей с одинаковым кол-вом очков
             HashSet<User> bucket = new HashSet<>();
              for(int i=0;i<list.size();i++){
                  User subItem = list.get(i);
                  if(item.getLeadQualificated() == subItem.getLeadQualificated()){
                      if(bucket.add(item)){
                         System.out.println("Добавил в корзину : "+item.getLeadQualificated()+"-> "+item.getManager());
                     }

                  }
             }
           
            resultMap.put(item.getLeadQualificated(),bucket);//(key-очки, value - список пользователей с таким кол-вом очков)
         }

Так как ты проходишь по все коллекции и каждый раз создаешь новый сет, и в него добавляешь только один элемент (возможно, опечатка item -> subItem?).
В любом случае алгоритм лучше преосмыслить и сделать оптимальней.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы