Сортировка парына Яве - PullRequest
       42

Сортировка парына Яве

2 голосов
/ 15 октября 2019

Я использую List<Pair<String, Integer>> и сортирую по ключу и значению, но он показывает следующую ошибку как non-static method getKey() cannot be referenced from a static context

Мой код выглядит следующим образом -

import javafx.util.Pair;
import java.util.*;
class Tuple
{
    // Demonstrate javafx.util.Pair class introduced in Java 8
    public static void main(String[] args)
    {
        List<Pair<String, Integer>> entries = new ArrayList<>();

        entries.add(new Pair<String,Integer>("C", 20));
        entries.add(new Pair<>("C++", 10));
        entries.add(new Pair<>("Java", 30));
        entries.add(new Pair<>("Python", 10));
        entries.add(new Pair<>("PHP", 20));
        entries.add(new Pair<>("PHP", 10));

        // Comparator<Pair<String,Integer>> c=Comparator.<Pair<String,Integer>>comparing(e->e.getKey).thenComparingInt(Pair::getValue;
        //entries.sort(c.reversed());
        // Comparator<Pair<String,Integer>> c=Comparator.<Pair<String,Integer>>comparing(e->e.getKey).thenComparingInt(Pair::getValue);
        entries.sort(Comparator.<Pair<String,Integer>>comparing(Pair::getKey).thenComparingInt(Pair::getValue));
        entries.forEach(e->System.out.println(e.getKey()+" "+e.getValue()));

    }
}


Ответы [ 3 ]

1 голос
/ 15 октября 2019

Comparator::comparing принимает два общих параметра T и U:

static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> var0)

, и вы передаете один. Первый параметр - это тип объекта, который вы сравниваете, а второй - какое свойство вы сравниваете. Попробуйте это:

Comparator<Pair<String, Integer>> pairComparator = Comparator.<Pair<String, Integer>, String>comparing(Pair::getKey).thenComparingInt(Pair::getValue);
entries.sort(pairComparator);

А также я бы не рекомендовал использовать для этой цели Pair форму класса JavaFX и использовать AbstractMap.SimpleEntry, например:

public static void main(String[] args) {
        List<AbstractMap.SimpleEntry<String, Integer>> entries = new ArrayList<>();

        entries.add(new AbstractMap.SimpleEntry<String, Integer>("C", 20));
        entries.add(new AbstractMap.SimpleEntry<>("C++", 10));
        //...

        Comparator<AbstractMap.SimpleEntry<String, Integer>> simpleEntryComparator = Comparator.<AbstractMap.SimpleEntry<String, Integer>, String>comparing(AbstractMap.Entry::getKey).thenComparingInt(AbstractMap.SimpleEntry::getValue);
        entries.sort(simpleEntryComparator);
        entries.forEach(e -> System.out.println(e.getKey() + " " + e.getValue()));
}
1 голос
/ 15 октября 2019

У вас было 2 проблемы:

  1. entries.sort(Comparator.<Pair<String, Integer>>comparing( вы указываете только один тип Generci, в то время как ожидаемые значения равны двум, т.е. ваш сопоставимый тип объекта и тип ключа. В этом случае тип ключа отсутствует.

  2. Вы не указали универсальный Type::getKey правильно. Укажите там универсальный тип или используйте лямбда-выражение.

Пример, приведенный ниже с лямбда-выражением и правильным универсальным типом:

 entries.sort(Comparator.<Pair<String, Integer>, String>comparing(p -> p.getKey()).thenComparingInt(Pair::getValue));

Вы можете использовать JOOL библиотека для типов кортежей. Это расширенная поддержка Java-8.

1 голос
/ 15 октября 2019

Сравните, используя Pair<String,Integer>::getKey:

entries.sort(Comparator.comparing(Pair<String,Integer>::getKey) .thenComparingInt(Pair::getValue))
...