簡體   English   中英

Java反轉地圖

[英]Java invert a map

我需要反轉原始地圖。 哪個類型是<Integer, String> ,如{1 = A, 2 = A, 3 = B....} 我想創建一個新的地圖是StringArrayList ,因為如果1 = A ,和2 = A ,比我想有這樣的事情: A = [1, 2]

那我該怎么辦呢?

您可以使用Java 8的stream API輕松完成,下面是一個示例:

public static void main(String[] args) throws FileNotFoundException {

    Map<Integer, String> map = new HashMap<>();
    map.put(1, "A");
    map.put(2, "A");
    map.put(3, "B");

    Map<String, List<Integer>> invertedMap = map.entrySet()
    .stream()
    .collect(Collectors.groupingBy(Entry::getValue, 
            Collectors.mapping(Entry::getKey, Collectors.toList())));

    System.out.println(invertedMap);

}

你可以試試這個:

HashMap<Integer, String> original = new HashMap<>();
HashMap<String, ArrayList<Integer>> inverted = new HashMap<>();

original.put(1, "A");
original.put(2, "B");
original.put(3, "C");
original.put(4, "A");

for (Integer key: original.keySet()) {
    String newKey = original.get(key);

    inverted.computeIfAbsent(newKey, k -> new ArrayList<>());
    inverted.get(newKey).add(key);

}
System.out.println(original);
System.out.println(inverted);

所以,假設HashMap<Integer, String> original{1=A, 2=B, 3=C, 4=A} ,那么你將獲得{A=[1, 4], B=[2], C=[3]}

編輯:如果你想要一個更通用的版本,就像@ Mr.Polywhirl建議的那樣,你可以使用:

public static final <T, U> Map<U, List<T>> invertMap(Map<T, U> map) {
    HashMap<U, List<T>> invertedMap = new HashMap<>();

    for (T key : map.keySet()) {
        U newKey = map.get(key);

        invertedMap.computeIfAbsent(newKey, k -> new ArrayList<>());
        invertedMap.get(newKey).add(key);

    }

    return invertedMap;
}

暫無
暫無

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

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