将字符串集作为键的Map转换为字符串Map(java)

nwwlzxa7  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(508)

这个问题并不难,我已经用我自己的方式解决了,但我想听听你的意见,也许有什么方法可以让这个选项变得更好? 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)));

所以,我的问题是——有没有更好的方法?我的意思是,也许流api已经有了一些方法来实现它?在“收集”方法的范围内

igsr9ssn

igsr9ssn1#

如果要使用收集器,可以执行以下操作: flatMap 首先,然后 toMap :

Map<String, User> result = existingMap.entrySet().stream().flatMap(
        entry -> entry.getKey().stream()
            .map(s -> Map.entry(s, entry.getValue()))
    )
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

或者如果你只是想使用 collect 仅(这与您最初的方法更相似):

Map<String, User> result = existingMap.entrySet().stream().collect(
    HashMap::new,
    (map, entry) -> entry.getKey().forEach(x -> map.put(x, entry.getValue())),
    HashMap::putAll
);
hwazgwia

hwazgwia2#

这个问题无法解决。
考虑以下事项:
("Bill", "Tom", "Alice") -> User1 ("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);
    }
}

相关问题