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

代码:

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

Pair是已提供给我的类,它不是Java类Pair(如果Java具有默认的Pair类,则为idk,以防万一,如果不是,则不是)。

该类对中没有定义compareTo,并且方法insert在某个时刻使用compareTo时会崩溃。

我需要实现抽象类Comparable并从外部重写该类中的compareTo方法,而无需修改Pair对的代码,这意味着我必须从“外部”进行操作。

有没有办法做到这一点?

这是我之前所做的:

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一起使用,由于某种原因它必须是可比较的,而且我不知道该怎么做,因为我无法参考(此):

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

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

编辑: 我调试了程序,这就是它崩溃的原因,这就是为什么我 认为我需要可比的:

public class DefaultComparator<E> implements Comparator<E> {
    @Override
    public int compare(E a,E b) throws ClassCastException {
        return ((Comparable<E>) a).compareTo(b); //here
    }
}
zijire1 回答:需要添加Comparable而不修改正在比较的类

您能否用自己的类扩展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> 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()); 
    }
}
,

您可以创建一个包装类来配对,而无需更改配对,而是添加与包装类类似的东西,然后您需要将链表的泛型更改为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<>();
本文链接:https://www.f2er.com/3054929.html

大家都在问