返回哈希表键排序后的列表?

时间:2019-06-22 23:49:57

标签: java dictionary lambda

我尝试对哈希图进行排序并返回结果键列表。这是我尝试过的:

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。

那是怎么回事?为什么我会收到此错误?

2 个答案:

答案 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())