Как я могу дублировать HashMap с дублирующимися значениями - PullRequest
0 голосов
/ 18 января 2020

Мне нужно создать новые HashMaps, которые содержат только дубликаты значений моего первого HashMap:

Original map: {Player1=Hello, Player2=Hi, Player3=Hi, Player4=Hello, Player5=Hello}

Для выходных данных я хочу получить:

Hello map: {Player1=Hello,Player4=Hello, Player5=Hello}
Hi map: {Player2=Hi, Player3=Hi}

Что лучше способ сделать?

Ответы [ 2 ]

2 голосов
/ 18 января 2020

Если вы используете Java8 +, вы можете использовать поток с groupingBy и toMap, например, так:

Map<String, Map<String, String>> collect = map.entrySet().stream()
        .collect(Collectors.groupingBy(Map.Entry::getValue,
                Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)));

Для простой карты ваши выходные данные могут быть:

Hi - {Player2=Hi, Player3=Hi}
Hello - {Player5=Hello, Player1=Hello, Player4=Hello}

Идеальная демонстрация

0 голосов
/ 18 января 2020
    class Player {
            private String name;
            private int id;

            public Player(int id) {
                this.id = id;
                this.name = "Player " + id;
            }

            @Override
            public int hashCode() {
                return this.id;
            }

            @Override
            public String toString() {
                return this.name;
            }
        }

        Player[] players = new Player[5];
        IntStream.range(0, players.length).forEach(i -> players[i] = new Player(i + 1));

        // -------------------------------------------------------------------------

        HashMap<Player, String> original = new HashMap<>();
        original.put(players[0], "Hello");
        original.put(players[1], "Hi");
        original.put(players[2], "Hi");
        original.put(players[3], "Hello");
        original.put(players[4], "Hello");

        HashMap<String, HashMap<Player, String>> duplicates = new HashMap<>();

        original.keySet().stream().forEach(key -> {
            String value = original.get(key);
            HashMap<Player, String> duplicate = duplicates.get(value);

            if (duplicate == null) {
                duplicate = new HashMap<>();

                duplicates.put(value, duplicate);
            }

            duplicate.put(key, value);
        });

        System.out.println("Original: " + original);

        duplicates.forEach((key, value) -> {
            System.out.println(key + ": " + value);
        });

//

Original: {Player 1=Hello, Player 2=Hi, Player 3=Hi, Player 4=Hello, Player 5=Hello}
Hi: {Player 2=Hi, Player 3=Hi}
Hello: {Player 1=Hello, Player 4=Hello, Player 5=Hello}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...