如何使用具有非唯一值的 Guava 进行地图反演?

发布于 2024-09-18 10:15:23 字数 614 浏览 4 评论 0 原文

我们如何用番石榴做到这一点?请注意返回类型中存在 List,因为许多键可以映射到任何法线映射中的相同值。

public static <K, V> Map<V, List<K>> inverse(Map<K, V> map){
    Map<V, List<K>> result = new LinkedHashMap<V, List<K>>();
    for (Map.Entry<K, V> entry : map.entrySet()) {
        if(!result.containsKey(entry.getValue())){
            result.put(entry.getValue(), new ArrayList<K>());                
        }
        result.get(entry.getValue()).add(entry.getKey());
    }        
    return result;        
}

BiMap 似乎坚持值的唯一性,但我没有这种奢侈。

How can we do that with Guava? Notice the presence of List<K> in the return type since many keys can map to the same value in any normal map.

public static <K, V> Map<V, List<K>> inverse(Map<K, V> map){
    Map<V, List<K>> result = new LinkedHashMap<V, List<K>>();
    for (Map.Entry<K, V> entry : map.entrySet()) {
        if(!result.containsKey(entry.getValue())){
            result.put(entry.getValue(), new ArrayList<K>());                
        }
        result.get(entry.getValue()).add(entry.getKey());
    }        
    return result;        
}

BiMap seems to insist on the unicity of the values, but I don't have this luxury.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

留一抹残留的笑 2024-09-25 10:15:23

您可以这样做:

Map<K, V> map = ...;
ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map), 
    ArrayListMultimap.<V,K>create());

请注意,几乎任何时候您编写 Map>Map> 或其中一些, ListMultimapSetMultimap 才是您真正想要的。

You can do this:

Map<K, V> map = ...;
ListMultimap<V, K> inverse = Multimaps.invertFrom(Multimaps.forMap(map), 
    ArrayListMultimap.<V,K>create());

Do note that pretty much any time you write Map<K, List<V>> or Map<K, Set<V>> or some such, a ListMultimap<K, V> or SetMultimap<K, V> is what you really want.

淡写薰衣草的香 2024-09-25 10:15:23

请改用多重贴图,选择一个使用列表的贴图,例如
ArrayListMultimap,这将允许受骗。

另外,您不必编写自己的反转方法,com.google.common.collect.Multimaps

Use a Multimap instead, pick one that uses a list, like
ArrayListMultimap, that will allow dupes.

Also you don't have to write your own invert method, there's one provided in com.google.common.collect.Multimaps.

故事灯 2024-09-25 10:15:23

如果有人现在在这里绊倒(在 Java 的 Stream 时代),这里有两个基于单表达式 Stream 的解决方案:

1)基于 ImmutableListMultimap< /a> + toImmutableListMultimap 收集器

ImmutableListMultimap<V, K> output = inputMap.entrySet().stream()
        .collect(ImmutableListMultimap.toImmutableListMultimap(Map.Entry::getValue, Map.Entry::getKey));

2) 基于 ArrayListMultimap + Multimaps.toMultimap 收集器

ListMultimap<V, K> output = inputMap.entrySet().stream()
        .collect(Multimaps.toMultimap(Map.Entry::getValue, Map.Entry::getKey, ArrayListMultimap::create));

In case someone stumbles here now (well within Java's Stream era), here are two single-expression Stream-based solutions:

1) Immutable version based on ImmutableListMultimap + toImmutableListMultimap collector

ImmutableListMultimap<V, K> output = inputMap.entrySet().stream()
        .collect(ImmutableListMultimap.toImmutableListMultimap(Map.Entry::getValue, Map.Entry::getKey));

2) Mutable version based on ArrayListMultimap + Multimaps.toMultimap collector

ListMultimap<V, K> output = inputMap.entrySet().stream()
        .collect(Multimaps.toMultimap(Map.Entry::getValue, Map.Entry::getKey, ArrayListMultimap::create));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文