Получить список ключей, значения которых для этих ключей равны - PullRequest
0 голосов
/ 18 декабря 2011

Мне требуется получить список ключей, значения которых равны для этих ключей, из HashMap. Например, мой hashmap содержит следующие элементы.

Key  Value
1    a,b
2    e,c
3    a,b
4    f
5    e,c
6    c

Нам нужно оценить как

1,3 contains value (a,b)  
2,5 contains value (e,c)  
4   contains value (f)  
6   contains value (c)

Thx

Ответы [ 4 ]

3 голосов
/ 18 декабря 2011

Вы можете инвертировать ваш хэш: создайте новый хеш с типом ключа, являющимся типом значения вашей текущей карты, и типом значения, являющимся списком типа ключа вашей текущей карты.

Итерирование по текущемуключи карты, и нажмите их в нужное место на вашей новой карте.После этого у вас будет именно то отображение, которое вы запрашиваете.

Если значения в вашей текущей карте прямо не сопоставимы прямо сейчас, вам нужно найти представление, которое есть.Это полностью зависит от характера данных.
Один простой подход заключается в сортировке списка и использовании его представления toString в качестве нового ключа.Это работает только в том случае, если toString представление базовых объектов является нормальным для этой цели.

1 голос
/ 18 декабря 2011

Самый простой метод:

  1. Получить первый ключ HashMap и выполнить итерацию по карте, проверяя наличие ключей с тем же значением.
  2. Если найденоудалите этот ключ из карты и сохраните ключ в другой коллекции (возможно, Vector).
  3. Затем, после проверки всех остальных ключей, добавьте текущий ключ в эту коллекцию.
  4. Если другие ключи не найдены, добавьте текущий ключ в эту коллекцию.
  5. Затем добавьте ключи в этой коллекции на другую карту с соответствующим значением.Очистите коллекцию.
  6. Перейдите к следующей клавише и сделайте то же самое.

После этого вы получите то, что хотите.

РЕДАКТИРОВАТЬ:Код:

    HashMap comp = new HashMap(); // Calculations Done
    Vector v = new Vector(); // Temporary List To Store Keys

    // Get The List Of Keys
    Vector<Integer> keys = new Vector<Integer>();
    Iterator<Integer> it = hm.keySet().iterator();
    while(it.hasNext()) keys.add(it.next());

    // For Every Key In Map...
    for(int i = 0; i < hm.size(); i++) {
        int key = keys.get(i);
        v.add(key);  // Add the Current Key To Temporary List

        // Check If Others Exist
        for(int j = i+1; j < hm.size(); j++) {
            int nkey = keys.get(j);
            if(hm.get(key).equals(hm.get(nkey))) {
                v.add(nkey);
            }
        }

        // Store The Value Of Current Key And The Keys In Temporary List In The Comp HashMap
        String val = hm.get(key);
        String cKey = "";
        for(int x = 0; x < v.size(); x++)
            cKey += v.get(x) + ",";

        // Remove The Comma From Last Key, Put The Keys As Value And Value As Key
        cKey = cKey.substring(0, cKey.length()-1);
        comp.put(cKey, val);

        // Clear The Temporary List
        v.clear();
    }

В этом коде есть небольшая проблема: появляются дубликаты, и последний дубликат кажется правильным.

Вывод с использованием вашего примера дает.(Вам нужно немного отформатировать).

{3=a,b, 6=c, 5=e,c, 2,5=e,c, 4=f, 1,3=a,b}
1 голос
/ 18 декабря 2011

Опираясь на ответ Мата, если вам нужно часто выполнять эту операцию, используйте один из классов двунаправленной карты из коллекций Guava или Apache Commons;например, HashBiMap<K,V> или DualHashBidiMap или DualTreeBidiMap.Эти структуры данных поддерживают пару карт, которые представляют прямое и обратное сопоставления.

В качестве альтернативы для однократного вычисления:

  1. Извлечение Map.entries()коллекция в массив.
  2. Сортировка массива в порядке значений.
  3. Перебор массива и извлечение ключей ввода, для которых последующие значения входа равны.

(это должно быть O(NlogN) по времени и занимать O(N) дополнительное пространство ... в зависимости от используемого алгоритма сортировки.)

1 голос
/ 18 декабря 2011

Вы можете создать другую карту, где ваши ключи используются в качестве значений, а значения в качестве ключей. Например, если ваша исходная карта определена как Map<Integer, String> create map Map<String, List<Integer>>. Список целых чисел будет содержать ключи (из вашей исходной карты), которые имеют определенные значения.

...