Java:对具有两种类型的泛型类进行排序

5
假设有以下两个类型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; }
}

以及其项目列表

List<Pair<Integer, Integer>> = new ArrayList<>() 

需要根据第一/第二属性对其进行排序。不幸的是,类定义存在一些问题,会出现以下错误:
Error 1: wrong number of type arguments

如何设计比较器类?这段代码很可能是完全错误的。
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

感谢您的帮助。

1
我认为你不能使用 <> 来比较泛型类型,这些符号只适用于原始类型。相反,尝试使用类似 return p1.getSecond().compareTo(p2.getSecond()); 的方法。 - azurefrog
你想如何比较两个对? - Sweeper
1
我不会让一个通用的Pair类实现Comparable接口。谁知道TU是否可比较?如果用户想要对他们的pair进行排序,就让他们自己创建一个自定义的Comparator吧,这样他们可以决定是按第一个字段、第二个字段、还是组合排序等等。 - John Kugelman
@azurefrog:比较器已根据您的建议进行了更新。 - justik
我不是在问你能做什么。你应该做什么? - Sweeper
显示剩余3条评论
2个回答

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

为了对列表进行排序,请执行以下操作:
list.sort(Comparator.comparing(Pair::getFirst).thenComparing(Pair::getSecond));

要按照列表中的第二个字段进行排序,请执行以下操作:

list.sort(Comparator.comparing(Pair::getSecond));

事实上,您不需要实现Comparable来对列表进行排序。是的,但总体而言,只有在具有自然顺序时才需要实现Comparable。而在这种情况下显然不是这种情况,因此使用Comparator更合理。 - davidxxx

1
你应该确保你的 TU 类型扩展了 Comparable,并且让你的 Pair 类实现 Comparable<Pair<T,U>>
public class Pair<T extends Comparable<T>, U extends Comparable<U>> implements Comparable<Pair<T,U>>  {

        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; }

        @Override
        public int compareTo(Pair<T, U> o) {
            return this.second.compareTo(o.second);
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接