Как объединить ключи на основе значения в hashmap?

Мне интересно, был ли способ объединить ключи на основе одинаковых значений в Hashmap. Ex.

A->2
B->1
C->2

Результат, который я ищу:

2 - A, C
1 - B

4 ответа

Одним из способов является определение вашей карты следующим образом:

Map<String,List<String>> multiValueMap = new HashMap();

Или, если вы не хотите изобретать велосипед, используйте Apache MultiMap

Вам придется изменить структуру данных, чтобы хранить данные таким образом. Использовать HashMap из ArrayList или же Set (в зависимости от вас), чтобы сделать это.

пример

HashMap<Character, Integer> map = new HashMap<>();
map.put('A', 2);
map.put('B', 1);
map.put('c', 2);

// SORTED
HashMap<Integer, List<Character>> sortedMap = new HashMap<>();
ArrayList<Character> list = new ArrayList<>();
for(Map.Entry<Character, Integer> entry : map.entrySet()){
    list = sortedMap.get(entry.getValue());
    if(list == null){
        list = new ArrayList<>();
        entry.put(entry.getValue(), list);
    }
    list.add(entry.getKey());
}

HashMap Reversal

HashMap<String,Integer> aHM = new HashMap<String,Integer>();
HashMap<Integer,ArrayList<String>> aHMrev = new HashMap<Integer,ArrayList<String>>();
//HashMap Reversal
for (String f : aHM.keySet()){
    if(aHMrev.get(aHM.get(f)) != null){
        ArrayList<String> al = aHMrev.get(aHM.get(f));
        al.add(f);
        aHMrev.put(aHM.get(f), al);
    }
    else{
        ArrayList<String> al = new ArrayList<String>();
        al.add(f);
        aHMrev.put(aHM.get(f), al);
    }
}

пример

    aHM = [LMWEB1B-VMH.log=Group1,PLMWEB1E-VMH.csv=Group3, 
    LMWEB1A-VMH.log=Group1,
    LMWEB1E-VMH.log=Group2,
    PLMWEB1D-VMH.csv=Group3,
    LMWEB1F-VMH.log=Group2,
    PLMWEB1C-VMH.csv=Group3,
    PLMWEB1A-VMH.csv=Group2,
    PLMWEB1B-VMH.csv=Group3,
    PLMDB1-VMH.csv=Group2,
    LMWEB1D-VMH.log=Group1,
    PLMWEB1F-VMH.csv=Group3,
    LMWEB1C-VMH.log=Group1]

    aHMrev = {
    Group1=[LMWEB1B-VMH.log, LMWEB1A-VMH.log, LMWEB1D-VMH.log,LMWEB1C-VMH.log],
    Group2=[LMWEB1E-VMH.log, LMWEB1F-VMH.log,PLMWEB1A-VMH.csv,PLMDB1-VMH.csv],
    Group3=[D:\Trash\Logs\Perfmon\PLMWEB1E-VMH.csv,PLMWEB1D-VMH.csv,PLMWEB1C-VMH.csv,PLMWEB1B-VMH.csv,PLMWEB1F-VMH.csv]}

Вы просто создаете HaspMap как ниже:

Map<Integer, List<String>> map1 = new HashMap<>();
ArrayList<String> al = new ArrayList<>();
al.add("B");
map1.put(1, al);
al = new ArrayList<>();
al.add("A");
al.add("C");
map1.put(2, al);
Другие вопросы по тегам