首页 > 解决方案 > 将带有字符串集的 Map 转换为带有字符串的 Map (Java)

问题描述

这个问题并不难,我已经用自己的方式解决了,但我想听听你的意见,也许有什么方法可以让这个选项变得更好?爪哇 8-11。

Map<Set<String>, User> --> Map<String, User>

想象一下,集合内的元素不会重复。还有一点需要注意:许多唯一键可以指向相同的值。

我用以下代码做到了这一点:

Map<String, User> result = new HashMap<>();
existingMap.forEach((set, user) -> set.forEach(item -> result.put(set, user)));

所以,我的问题是 - 有没有更好的方法呢?我的意思是,也许 Stream API 已经有一些方法可以做到这一点?在“收集”方法的范围内

标签: javadictionaryjava-8streamjava-11

解决方案


这个问题无法解决。

考虑以下:

  1. ("Bill", "Tom", "Alice") -> User1
  2. ("Bill", "Tom", "Jane") -> User2

这对结构 1 ( Map<Set<String>, User>) 有效,但对结构 2 ( ) 无效,Map<String, User>因为它会导致数据丢失(有关 Bill 和 Tom 的信息将丢失)。

您可以考虑的另一种结构是从Map<Set<String>, User>到的转换Map<String, Set<User>>,这不会导致数据降级。

编辑:假设根据评论可以接受数据丢失,正常的 for 循环解决方案是:

Map<String, User> results = new HashMap<>();
for (Set<String> key : existing.keySet())
{
    User v = existing.get(key);
    for (String k : key)
    {
        results.put(k, v);
    }
}

推荐阅读