fork download
  1. import java.util.*;
  2. import java.util.stream.*;
  3.  
  4. class Shop {
  5.  
  6. public static void main(String[] args) {
  7. List<Shop> shops = Arrays.asList(
  8. new Shop("Walmart", "Hammer", 100),
  9. new Shop("Target", "Scissor", 30),
  10. new Shop("Walgreens", "Hammer", 300),
  11. new Shop("Glens", "Hammer", 500),
  12. new Shop("Walmart", "Scissor", 75),
  13. new Shop("Toms", "Hammer", 150)
  14. );
  15.  
  16. Map<String, List<Shop>> result = shops.stream()
  17. .collect(Collectors.groupingBy(Shop::item, Collectors.collectingAndThen(Collectors.toList(), list -> {
  18. Collections.sort(list, Comparator.comparing((Shop shop) -> shop.size()).reversed());
  19. return list.subList(0, Math.min(3, list.size()));
  20. })));
  21. result.forEach((k, v) -> {
  22. System.out.println(k);
  23. v.forEach(subshop -> System.out.println(" - " + subshop));
  24. });
  25. }
  26.  
  27. String name;
  28. String item;
  29. int size;
  30.  
  31. Shop(String name, String item, int size) {
  32. this.name = name;
  33. this.item = item;
  34. this.size = size;
  35. }
  36.  
  37. String name() {
  38. return name;
  39. }
  40.  
  41. String item() {
  42. return item;
  43. }
  44.  
  45. int size() {
  46. return size;
  47. }
  48.  
  49.  
  50. @Override
  51. public String toString() {
  52. return String.format("Shop(name=%s, item=%s, size=%s)", name, item, size);
  53. }
  54. }
Success #stdin #stdout 0.13s 55192KB
stdin
Standard input is empty
stdout
Hammer
  - Shop(name=Glens, item=Hammer, size=500)
  - Shop(name=Walgreens, item=Hammer, size=300)
  - Shop(name=Toms, item=Hammer, size=150)
Scissor
  - Shop(name=Walmart, item=Scissor, size=75)
  - Shop(name=Target, item=Scissor, size=30)