Java 对一对进行排序<;字符串,整数>;在爪哇

Java 对一对进行排序<;字符串,整数>;在爪哇,java,list,arraylist,java-8,comparator,Java,List,Arraylist,Java 8,Comparator,我正在使用一个列表并根据键和值进行排序,但它显示了以下错误,因为非静态方法getKey()无法从静态上下文引用 我的代码如下- 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&l

我正在使用一个
列表
并根据键和值进行排序,但它显示了以下错误,因为
非静态方法getKey()无法从静态上下文引用

我的代码如下-

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

    }
}


导入javafx.util.Pair;
导入java.util.*;
类元组
{
//演示Java 8中引入的javafx.util.Pair类
公共静态void main(字符串[]args)
{
列表项=新的ArrayList();
增加(新的一对(“C”,20));
添加(新的一对(“C++”,10));
添加(新的一对(“Java”,30));
添加(新的一对(“Python”,10));
添加(新的一对(“PHP”,20));
添加(新的一对(“PHP”,10));
//比较器c=比较器。比较(e->e.getKey)。然后比较(Pair::getValue;
//条目.sort(c.reversed());
//比较器c=比较器。比较(e->e.getKey)。然后比较(Pair::getValue);
entries.sort(Comparator.comparing(Pair::getKey)。然后比较int(Pair::getValue));
entries.forEach(e->System.out.println(e.getKey()+“”+e.getValue());
}
}
使用
Pair::getKey进行比较

entries.sort(Comparator.comparing(Pair<String,Integer>::getKey) .thenComparingInt(Pair::getValue))
entries.sort(Comparator.comparing(Pair::getKey)。然后比较int(Pair::getValue))

Comparator::comparating
采用两个通用参数
T
U

static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> var0)
您有两个问题:

  • entries.sort(Comparator.comparating)(
    您只指定了一个generic类型,而预期的是两个generic类型,即您的可比较对象类型和键类型。在本例中缺少键类型

  • 您没有正确指定泛型
    类型::getKey
    。请在此处指定泛型类型或使用lambda表达式

  • 下面的示例使用lambda表达式和正确的泛型类型:

     entries.sort(Comparator.<Pair<String, Integer>, String>comparing(p -> p.getKey()).thenComparingInt(Pair::getValue));
    
    entries.sort(Comparator.comparing(p->p.getKey())。然后比较int(Pair::getValue));
    

    您可以将库用于元组类型。它扩展了对java-8的支持。

    可能的重复项不适用于
    Pair
    到您以前使用的问题
    comparingit
    ,而不是
    comparing
    。使用时代码会变得更简单,例如
    比较器。比较(Pair::getKey)。然后比较(Pair::getValue);
    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()));
    }
    
     entries.sort(Comparator.<Pair<String, Integer>, String>comparing(p -> p.getKey()).thenComparingInt(Pair::getValue));