Java 反转映射

2022-09-01 09:26:12

我需要创建反向映射 - 选择唯一值并为它们找到键。似乎唯一的方法是迭代所有键/值对,因为 entrySet 返回一组<键,值>所以值不是唯一的?


答案 1

映射中的值可能不是唯一的。但是,如果它们是(在你的情况下),你可以按照你在问题中写的那样做,并创建一个通用方法来转换它:

private static <V, K> Map<V, K> invert(Map<K, V> map) {

    Map<V, K> inv = new HashMap<V, K>();

    for (Entry<K, V> entry : map.entrySet())
        inv.put(entry.getValue(), entry.getKey());

    return inv;
}

Java 8:

public static <V, K> Map<V, K> invert(Map<K, V> map) {
    return map.entrySet()
              .stream()
              .collect(Collectors.toMap(Entry::getValue, Entry::getKey));
}

用法示例:

public static void main(String[] args) {

    Map<String, Integer> map = new HashMap<String, Integer>();

    map.put("Hello", 0);
    map.put("World!", 1);

    Map<Integer, String> inv = invert(map);

    System.out.println(inv); // outputs something like "{0=Hello, 1=World!}"
}

附注:该方法将返回密钥的“old”值。如果它不是空的,你可以抛出一个或类似的东西。put(.., ..)new IllegalArgumentException("Map values must be unique")


答案 2

看看谷歌番石榴BiMap

用法示例

Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");

Map<String, Integer> inverted = HashBiMap.create(map).inverse();