Map<String, Integer> zliczanie powtórzeń - ilość farb

0

Mapa wygląda tak:

Kolor Ilość
czerwony 6
zielony 9
niebieski 10
czarny 1
czerwony 2
zielony 12

Muszę zliczyć sumę kolorów. Czyli czerwony = 8, zielony = 21 itd. A potem wyświetlić farbę która ma największą ilość.

Poddacie jakieś pomysły z tą mapą jak to zrobić krok po kroku ?

5

Po pierwsze pokaż co zrobiłeś do tej pory, wtedy możemy pomyśleć jak Ci pomóc.
Po drugie, jeżeli kolor to klucz w mapie to muszę Cię zmartwić - klucze w mapie są unikalne, tak więc możesz mieć tylko jeden czerwony i jeden zielony.
A potem wyświetlić farbę która ma największą ilość. https://www.geeksforgeeks.org/stream-max-method-java-examples/ - pierwszy link z Googla

0

Są implementacje map z kluczami które mogą się duplikować więc jest to do zrobienia, pytanie czy potrzebne. Daj treść zadania i to co naskrobałeś

0

Tak na szybko można też użyć mapy list ewentualnie MultiMap z guava:

Map<String, List<Integer>> colorMap = new HashMap<>();
colorMap.put("czerwony", List.of(6, 2));
colorMap.put("zielony", List.of(9, 12));
colorMap.put("niebieski", List.of(10));
colorMap.put("czarny", List.of(1));

colorMap.entrySet().stream()
        .map(e -> Map.entry(
                e.getKey(),
                e.getValue().stream().mapToInt(Integer::intValue).sum())
        )
        .max(Comparator.comparingInt(Map.Entry::getValue))
        .ifPresent(System.out::println);
1

A nie lepiej do pierwszej części użyć recordów?
record ColorQuantity(Color color, int quantity)?
No chyba że to rzeczywiście musi być mapa to wtedy wartość to lista intow.

0

Jeśli coś się da zrobić łatwo na streamach to chyba najlepiej to zrobić łatwo na streamach:

    public static void main(final String[] args) {
        Optional<Map.Entry<String, Integer>> result = Stream.of( // budujemy strumień z wpisami
                entry("czerwony", 6),
                entry("zielony", 9),
                entry("niebieski", 10),
                entry("czarny", 1),
                entry("czerwony", 2),
                entry("zielony", 12)
        ).collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.summingInt(Map.Entry::getValue))) // tutaj masz mapę z sumami, tzn. czerwony -> 8, zielony -> 21
                .entrySet()
                .stream()
                .sorted((l, r) -> Integer.compare(r.getValue(), l.getValue())) // sortujesz odwrotnie, tj. większe wartości później
                .findFirst(); // znajdujesz pierwszy taki element

        System.out.println(result.orElseThrow().toString());
    }

    private static Map.Entry<String, Integer> entry(final String color, final int value) {
        return Map.entry(color, value);
    }
0

@KotAli:
Zrób sobie jakąś klasę w stylu Colour, która będzie miała dwie właściwości: kolor i cenę. Te obiektu wrzucasz potem w listę. Potem można zrobić coś podobnego jak jest wyżej przy użyciu strimów.

Ta klasa Colour ma reprezentować jakby puszki z farbą tak?

1 użytkowników online, w tym zalogowanych: 0, gości: 1