需要添加 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<>();
代码:
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<>();