如何优雅地交换Map中的键和值

kos*_*tja 16 java collections hashmap

我已经知道如何以艰难的方式完成它并使其工作 - 迭代条目并"手动"交换.但我想知道,像这么多任务一样,这个问题能否以更优雅的方式解决.

我读过这篇文章,遗憾的是它没有优雅的解决方案.我也没有可能使用任何花哨的Guava BiMaps或jdk以外的任何东西(已经定义了项目堆栈).

我可以假设我的地图是双射的,顺便说一下:)

小智 34

Map<String, Integer> map = new HashMap<>();
Map<Integer, String> swapped = map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
Run Code Online (Sandbox Code Playgroud)

  • 如果原始地图中的值位于多个键中,该怎么办?您会在交换时失去值并获得异常 (2认同)
  • Map&lt;Integer, List&lt;String&gt;&gt; swapped = map.entrySet().stream().collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList()) ))); (2认同)

Eya*_*der 22

如果您没有选择使用第三方库,我不认为以下代码如此丑陋(尽管一些脚本语言确实有优雅的方法):

//map must be a bijection in order for this to work properly
public static <K,V> HashMap<V,K> reverse(Map<K,V> map) {
    HashMap<V,K> rev = new HashMap<V, K>();
    for(Map.Entry<K,V> entry : map.entrySet())
        rev.put(entry.getValue(), entry.getKey());
    return rev;
}
Run Code Online (Sandbox Code Playgroud)


Aar*_*lla 9

标准API/Java运行时不提供双向映射,因此唯一的解决方案是迭代所有条目并手动交换它们.

你可以做的是创建一个包装器类,它包含两个映射,并在put()内部执行双重操作,因此您可以快速获得两个数据视图.

[编辑]此外,由于开源,您不必包含第三方库,您只需将您需要的类复制到您自己的项目中.