需要添加 Comparable 而不修改正在比较的 class

Need to add Comparable without modifying the class that is comparing

代码:

LinkedBinarySearchTree <Pair<String, Integer>> at = new LinkedBinarySearchTree<>();
Pair<String, Integer> p = new Pair<>(str, dni);
at.insert(p);

对是给我的 class,它不是 java class 对(如果 java 有默认对 class 但万一它有一个,这个不是那个)。

class 对没有在其中定义 compareTo 并且方法 insert 在某些时候使用了 compareTo,当它崩溃时。

我需要实现抽象的classComparable,并从外部覆盖class中的compareTo方法,而不修改classPair的代码,也就是说我有从 "outside".

开始

有办法吗?

这是我之前做的:

public class MyComparator implements Comparator <Pair<String, Integer>> {
        @Override
        public int compare(Pair<String, Integer> o1, Pair<String, Integer> o2) {
           final Collator instance = Collator.getInstance();
            instance.setStrength(Collator.NO_DECOMPOSITION);


        if (!o1.getFirst().equals(o2.getFirst())){
            return o1.getFirst().compareTo(o2.getFirst());
        } else {
            return o1.getSecond().compareTo(o2.getSecond());
        }
    }
}

但它不适用于 Comparator,出于某种原因它必须是 Comparable 而我不知道该怎么做,因为我无法引用 (this):

public class MyComparable implements Comparable <Pair<String, Integer>> {
        @Override
        public int compareTo(Pair<String, Integer> o) {
           final Collator instance = Collator.getInstance();
            instance.setStrength(Collator.NO_DECOMPOSITION);

        //I can't use "this" here because ovbiously I'm not inside the class Pair so I don't know how to do it
        if (!this.getFirst().equals(o.getFirst())){   //I can't use "this"
            return this.getFirst().compareTo(o.getFirst());
        } else {
            return this.getSecond().compareTo(o.getSecond());
        }
    }
}

我需要帮助,我一直在尝试自己寻找答案,但我没有想法...如果这个问题太简单或没有帮助,我很抱歉,但我在这里有点挣扎: /.

编辑: 我调试了程序,这就是它崩溃的地方,这就是为什么我 认为我需要 Comparable:

public class DefaultComparator<E> implements Comparator<E> {
    @Override
    public int compare(E a, E b) throws ClassCastException {
        return ((Comparable<E>) a).compareTo(b); //here
    }
}

你能不能用你自己的 class 扩展 Pair,它也实现了 Comparable 并使用它?

public class MyPair<T, O> extends Pair<T, O> implements Comparable<MyPair<T, O>> {
    @Override
    public int compareTo(MyPair<T, O> other) {
           //logic to compare
    }
}

然后使用

LinkedBinarySearchTree <MyPair<String, Integer>> at = new LinkedBinarySearchTree<>();

根据评论编辑: 如果您知道 Pair 中使用的对象类型本身就是 Comparable,那么您可以使用有界泛型参数。所以上面的例子变成:

public class MyPair<T extends Comparable<T>, O extends Comparable<O>> extends Pair<T, O> implements Comparable<MyPair<T, O>> {
    @Override
    public int compareTo(MyPair<T, O> other) {
           //Now the compiler knows that T and O types are Comparable (that 
           //is they implement the Comparable interface) and 
           //this means their compareTo() can be used

           return this.getFirst().compareTo(other.getFirst()); 
    }
}

您可以创建一个包装器 class 来配对而不更改对但添加可比包装器,然后您需要将链表的通用更改为 ComparablePair

class ComparablePair implements Comparable < ComparablePair > {
  private Pair < String,Integer > pair;
  @Override
  public int compareTo(ComparablePair o) {
    Pair otherPair = o.pair;
    //compare this.pair and otherpair here.
    return 0;
  }
}


LinkedBinarySearchTree <ComparablePair> at = new LinkedBinarySearchTree<>();