Java:使用两种类型对通用类进行排序

jus*_*tik 5 java generics comparator

假设以下具有2个类型T,U的泛型类

public class Pair<T, U> implements Comparable<T, U>  { //Error 1

   private final T first;
   private final U second;

   public Pair(T first_, U second_) {
      first = first_;
      second = second_;}

   public T getFirst() { return first; }
   public U getSecond() { return second; }
}
Run Code Online (Sandbox Code Playgroud)

及其项目清单

List<Pair<Integer, Integer>> = new ArrayList<>() 
Run Code Online (Sandbox Code Playgroud)

需要根据first / second属性进行排序。不幸的是,类定义包含一些问题,出现以下错误:

Error 1: wrong number of type arguments
Run Code Online (Sandbox Code Playgroud)

如何设计比较器类?此代码可能是完全错误的

public class SortBySecond implements Comparable <Pair <T, U>> {

    public int compare(final Pair<T, U> p1, final Pair<T, U> p2) //Error 2
    {
        return t1.getSecond().compareTo(t2.getSecond()); //Updated comparator
    }
}

Error 2 : Can not find symbols T, U, V
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助。

Swe*_*per 5

您的Pair类应实现Comparable<Pair<T, U>>而不是Comparable<T, U>,这是不存在的类型。您还应该确保TU是可比较的。

Comparator界面中有许多有用的方法可以帮助您比较事物。您可以使用它们来实现Comparable<Pair<T, U>>。实际上,您无需实现Comparable对列表进行排序的功能。您只需要创建一个Comparator

实施方法Comparable如下:

class Pair<T extends Comparable<T>, U extends Comparable<U>> implements Comparable<Pair<T, U>> {
    public int compare(final Pair<T, U> p1, final Pair<T, U> p2)
    {
        // this first compares the first field. If the first fields are the same, the second fields are compared
        // If you have a different requirement, implement it accordingly.
        return Comparator.comparing(Pair::getFirst).thenComparing(Pair::getSecond).compare(p1, p2);
    }
}
Run Code Online (Sandbox Code Playgroud)

要对列表进行排序,请执行以下操作:

list.sort(Comparator.comparing(Pair::getFirst).thenComparing(Pair::getSecond));
Run Code Online (Sandbox Code Playgroud)

要仅使用第二个字段对列表进行排序,请执行以下操作:

list.sort(Comparator.comparing(Pair::getSecond));
Run Code Online (Sandbox Code Playgroud)