簡體   English   中英

反轉地圖 | 值 ---> 鍵

[英]Invert Map | Values ---> Keys

我希望能夠反轉具有多個鍵可以指向相同值的給定 HashMap。

HashMap<String, String> cities = new HashMap<String, String>();

        cities.put("Manchester", "UK");
        cities.put("London", "UK");
static HashMap<String, String> inverseMap(HashMap map) {
       // something that has "UK" point to both "Manchester" and "London"

      // if it can be done without using any special Java 8 feature, that would be great
}

我不確定從哪里開始。

像這樣做。 基本上,它使用合並函數來連接重復鍵的值。

  • 創建新地圖
  • 使用舊地圖的值作為新地圖的鍵
  • 如果新映射沒有鍵的值,則將值放入新映射中
  • 否則,將該值連接到該鍵的舊值
        HashMap<String, String> cities = new HashMap<String, String>();

        cities.put("Manchester", "UK");
        cities.put("London", "UK");
        cities.put("New York", "US");
        cities.put("Chicago", "US");

        Map<String,String> inverted = new HashMap<>();
        for (String key : cities.keySet()) {
            String newKey = cities.get(key);
            String value = inverted.get(newKey);
            if (value == null) {
                inverted.put(newKey, key);
            } else {
                value = value + ", " + key;
                inverted.put(newKey, value);
            }

        }
        for (Entry<String,String> e : inverted.entrySet()) {
            System.out.println(e.getKey() + " -> " + e.getValue());
        }

它打印

UK -> Manchester, London
US -> New York, Chicago

由於您沒有指定如何處理重復鍵。 我也可以將它存儲在Map<String,List<String>>

由於多個鍵可以包含相同的值,因此您必須能夠在逆映射中為每個鍵存儲多個值。 我建議使用 Set 作為這個值。

  • 創建一個可以將一組字符串保存為值的地圖
  • 遍歷原始地圖
  • 如果在新地圖中找不到該國家/地區,請在那里創建一個條目
  • 將城市添加到地圖

這也應該適用於沒有依賴關系的 Java 7。

static HashMap<String, Set<String>> inverseMap(HashMap<String,String> map) {
    HashMap<String,Set<String>> inversed=new HashMap<>();
    for(Map.Entry<String,String> entry:map.entrySet()){
        if(!inversed.containsKey(entry.getValue())){
            inversed.put(entry.getValue(),new HashSet<>());
        }
        inversed.get(entry.getValue()).add(entry.getKey());
    }
    return inversed;
}

{Manchester=UK,London=UK}將變成{UK={Manchester,London}} (順序可能不同)。

這是你要找的嗎?

Map<String, String> cities = new HashMap<>();
cities.put("Manchester", "UK");
cities.put("London", "UK");
Map<String, List<String>> reverseMap = new HashMap<>();
for (Entry<String, String> entry : cities.entrySet()) {
     List<String> list = reverseMap.get(entry.getValue());
     if (list == null) {
         list = new ArrayList<>();
         reverseMap.put(entry.getValue(), list);
     }
     list.add(entry.getKey());
}

System.out.println(reverseMap);

你可以看看MultiMap。 它允許將單個鍵映射到多個值。

這是谷歌番石榴https://guava.dev/releases/19.0/api/docs/com/google/common/collect/Multimap.html

ListMultimap<String, String> multimap = ArrayListMultimap.create();
   for (President pres : US_PRESIDENTS_IN_ORDER) {
     multimap.put(pres.firstName(), pres.lastName());
   }
   for (String firstName : multimap.keySet()) {
     List<String> lastNames = multimap.get(firstName);
     out.println(firstName + ": " + lastNames);
   }
... produces output such as:
   Zachary: [Taylor]
   John: [Adams, Adams, Tyler, Kennedy]  // Remember, Quincy!
   George: [Washington, Bush, Bush]
   Grover: [Cleveland, Cleveland]        // Two, non-consecutive terms, rep'ing NJ!

在 Apache Commons Collections https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/MultiValuedMap.html

     MultiValuedMap<K, String> map = new MultiValuedHashMap<K, String>();
     map.put(key, "A");
     map.put(key, "B");
     map.put(key, "C");
    Collection<String> coll = map.get(key);
coll will be a collection containing "A", "B", "C".

您可以遍歷原始地圖的條目集並使用值(國家/地區代碼)作為鍵並將每個鍵(城市)添加到列表中:

static HashMap<String, List<String>> inverseMap(HashMap<String, String> map) {
   HashMap<String, List<String>> countryToCity = new HashMap<>();
   for(Map.Entry<String,String> entry: map.entrySet()){
       countryToCity.computeIfAbsent(entry.getValue(), k -> new ArrayList<>()).add(entry.getKey());
   }
   return countryToCity;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM