вернуть список ключей hashmap после сортировки? - PullRequest
1 голос
/ 23 июня 2019

Я пытаюсь отсортировать хэш-карту и вернуть список ключей результата. Вот что я пробовал:

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 () location: переменная e типа java.lang.Object

Я знаю, что нехорошо просто опубликовать некоторый код и сообщение об ошибке. Но на самом деле я искал час и ничего не нашел. Также для меня код имеет смысл, и я понятия не имею, почему getKey записи не распознается.

Так что же происходит? почему я получаю эту ошибку?

Ответы [ 2 ]

2 голосов
/ 23 июня 2019

Я почти уверен, что ваш класс Edge реализует Comparable:

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());

Проблема связана с выводом типа обобщенных элементов при цепном вызове. Это может дать вам более подробную информацию.

1 голос
/ 23 июня 2019

У меня нет ваших классов, но я считаю, что это то, что вы хотите.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...