Найти 4 самых популярных объекта в списке - PullRequest
1 голос
/ 29 мая 2019

Допустим, у меня есть список "Предложения".Мне нужно получить ТОП 4 идентификаторов видео.

public class Suggestion{

   static allSuggestions = new ArrayList<Suggestion>();       

   int id;
   String videoId;

   public Suggestion(int id, String videoId){
     this.id = id;
     this.videoId = videoId;
     allSuggestions.add(this);
   }

   public String getVideoId(){
     return videoId;
   }

   public static List<Suggestion> getAllSuggestions(){
      return allSuggestions;
   }
}

Я пробовал это:

Suggestion.getAllSuggestions()
        .stream()
        .collect(Collectors.groupingBy(Suggestion::getVideoId, Collectors.counting()))
        .entrySet()
        .stream()
        .max(Comparator.comparing(Entry::getValue))
        .ifPresent(System.out::println);

Но он вернул только один, самый распространенный идентификатор видео, а не топ 4.

1 Ответ

2 голосов
/ 29 мая 2019

Сортировка записей по убыванию по количеству, затем выберите первые 4, используя limit:

Suggestion.getAllSuggestions()
    .stream()
    .collect(Collectors.groupingBy(Suggestion::getVideoId, Collectors.counting()))
    .entrySet()
    .stream()
    .sorted(Comparator.comparing(Entry::getValue).reversed()) // Sort descending by count
    .limit(4) // Top 4 only
    .forEach(System.out::println); // Print them, one per line
...