首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用集合转换集合

用集合转换集合
EN

Stack Overflow用户
提问于 2017-02-12 20:03:24
回答 3查看 172关注 0票数 3

我正在尝试执行以下代码:

代码语言:javascript
复制
Map<Node, TreeSet<String>> childrenNodes = new TreeMap<>(getAll());

我将getAllNodesAndEdges方法头放在下面:

代码语言:javascript
复制
public Map<Node, Set<String>> getAll() {...}

我需要将一个通用地图及其内部的集合转换为TreeMapTreeSet,以便进行排序打印。但是,第一段代码有一个编译错误,即"Cannot infer type arguments for TreeMap<>"

解决这个问题的最好方法是什么?

编辑:下面的更多信息

Information.java

代码语言:javascript
复制
public Map<Node, Set<String>> getAll() {
        return this.all;
}

但是,test1.java需要使用代码

代码语言:javascript
复制
 Map<Node, HashSet<String>> all = getAll()

test2.java需要使用代码

代码语言:javascript
复制
Map<Node, TreeSet<String>> childrenNodes = new TreeMap<Node, TreeSet<String>>(getAll());

但这两种运行类型不匹配编译错误。

第一项:

代码语言:javascript
复制
Type mismatch: cannot convert from Map<Node,Set<String>> to Map<Node,HashSet<String>>

第二部分:

代码语言:javascript
复制
The construtor TreeMap<Node,TreeSet<String>>(Map<Node,Set<String>>) is undefined
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-12 20:33:29

您必须为新映射的值创建新对象。

代码语言:javascript
复制
Map<Node, TreeSet<String>> converted = new TreeMap<>();

for(Entry<Node, Set<String>> entry : childrenNodes.entrySet()){
   converted.put(entry.getKey(), new TreeSet<>(entry.getValue()));
}
票数 2
EN

Stack Overflow用户

发布于 2017-02-12 20:24:48

你不能这样做。

你可以这样做:

1)改变变量childrenNodes的类型

代码语言:javascript
复制
Map<Node, Set<String>> childrenNodes = new TreeMap<>(getAll());

即不是Map<Node, TreeSet<String>>,而是Map<Node, Set<String>>

任一

2)使getAll()返回类型

代码语言:javascript
复制
Map<Node, TreeSet<String>> getAll()

编译器的错误确切地告诉您:从TreeSet<String>中推断Set<String>是不可能的。粗略地说,就像尝试这样的任务一样:HashMap<String> foo = getMap();getMap()返回的只是Map<String>

票数 0
EN

Stack Overflow用户

发布于 2017-02-13 11:02:07

您不能只将一种类型的集合(TreeSet,HashSet)转换到另一种类型。您需要通过方法参数传递供应商,例如TreeSet::new

代码语言:javascript
复制
private final Map<Node, Set<String>> all;

public <S extends Set<String>, M extends Map<Node, S>> M getAll(Supplier<M> mapFactory, Supplier<S> setFactory) {
    return all.entrySet().stream()
        .collect(Collectors.toMap(
            Map.Entry::getKey,
            e -> e.getValue().stream().collect(Collectors.toCollection(setFactory)),
            (v1, v2) -> v1, 
            mapFactory));
}

然后你会这样称呼它:

代码语言:javascript
复制
Map<Node, HashSet<String>> test1 = getAll(HashMap::new, HashSet::new);
Map<Node, TreeSet<String>> test2 = getAll(TreeMap::new, TreeSet::new);

或者更好的方法是,对您的局部变量类型使用排序的接口而不是实现类:

代码语言:javascript
复制
Map<Node, Set<String>> test1 = getAll(HashMap::new, HashSet::new);
SortedMap<Node, SortedSet<String>> test2 = getAll(TreeMap::new, TreeSet::new);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42192592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档