我尝试对哈希图进行排序并返回结果键列表。这是我尝试过的:
public List<City> getCities() {
Map<Node<City>, Edge> map = new HashMap<>();
// add entries to map ...
return map.entrySet().stream()
.sorted(Map.Entry.<Node<City>, Edge>comparingByValue())
.map(e -> e.getKey().getValue())
.collect(Collectors.toList());
}
边缘实现compairable并且getValue()方法将返回City对象。
public class Edge<T> implements Comparable<Edge<T>> {
private Node<T> a;
private Node<T> b;
private double weight;
public Edge(Node<T> a, Node<T> b) {
this.a = a;
this.b = b;
}
public void setWeight(double weight) {
this.weight = weight;
}
public double getWeight() {
return sum;
}
@Override
public int compareTo(Edge<T> o) {
return Double.compare(getWeight(), o.getWeight());
}
}
现在我的IDE不会抱怨任何东西,但是当我编译时会出现此错误:
错误:(104,28)Java:找不到符号 符号:方法getKey() 位置:类型为java.lang.Object
的变量e
我知道仅发布一些代码和错误是不好的。但实际上我搜索了一个小时却一无所获。同样对我来说,代码绝对有意义,我不知道为什么无法识别该条目的getKey。
那是怎么回事?为什么我会收到此错误?
答案 0 :(得分:2)
我很确定您的课程Edge
正在实现Comparable by:
class Edge implements Comparable
将您的类Edge声明更改为:
class Edge implements Comparable<Edge>
或通过以下方式划分返回逻辑:
Stream<Map.Entry<Node<City>, Edge>> sorted = map.entrySet().stream()
.sorted(Map.Entry.comparingByValue());
return sorted
.map(e -> e.getKey().getValue())
.collect(Collectors.toList());
问题归因于链式调用中泛型的类型推断。 https://hastebin.com/ucidewigij.cpp可能会为您提供更多详细信息。
答案 1 :(得分:1)
我没有您的课程,但我相信这就是您想要的。
Map<String, Integer> map = Map.of("Z", 10, "X", 8, "Y", 9);
// add entries to map ...
List<String> keys = map.entrySet().stream().sorted(
Comparator.comparing(e -> e.getValue())).map(
e -> e.getKey()).collect(Collectors.toList());
System.out.println(keys);
在您的示例中,.map(e -> e.getKey().getValue())
应该为.map(e ->e.getKey())