我有一些学校工作,我有BTree<E>
课程,现在我不得不做一个BSTree<E>
课程延伸BTree<E>
。 BSTree
应该是已排序的BTree
。
教师建议使用静态Comparator
,它可以按所需属性对所有元素进行排序。他给了我们一些代码,但不太明白如何在类中使用静态泛型变量。我知道静态的作用,但我不知道如何解决这个问题。
这是我的代码:
public class BSTree<E> extends BTree<E>{
List<E> duplicates;
static Comparator<E> comp = new NasComparator<E>();
private static class NasComparator<E extends Comparable> implements Comparator<E>{
@Override
public int compare(E o1, E o2){
return o1.compareTo(o2);
}
}
}
答案 0 :(得分:2)
可能有点偏离主题,但我认为值得一看。
你的比较器根本没用。通常我们需要一个Comparator,因为要比较的目标对象不是Comparable,或者默认比较不适合我们使用。
但是,如果您只是制作一个限制E扩展Comparable的比较器,并且比较逻辑只是return a.compareTo(b)
,那么为什么不直接比较呢?像
public class BSTree<E extends Comparable> extends BTree<E>{
}
您的排序只是使用Comparable#compareTo方法。
如果您想要选择让用户提供Comparator,请参阅TreeMap中的方法。基本思路是,如果提供比较器,则使用比较器,如果没有,则将条目转换为Comparable,然后进行比较。
如果你坚持使用比较器(这是你在评论中提到的,虽然我没有理由背后的原因),因为你需要你的元素Comparable
,所以你需要把它您的泛型类型参数中的限制,并简单地使比较器比较“可比较”。
public class BSTree<E extends Comparable> extends BTree<E>{
static Comparator<Comparable> comp = new ComparableComparator();
private static class ComparableComparator implements Comparator<Comparable>{
@Override
public int compare(Comparable o1, Comparable o2){
return o1.compareTo(o2);
}
}
}
看起来很奇怪,但这就是你要求的。
答案 1 :(得分:1)
您的代码有点棘手,因为您定义了两个E
:
BSTree<E>
使用的comp
中的一个:无法编译,因为E
仅在实例级别知道,不能在静态上下文中使用。< / LI>
NasComparator<E extends Comparable>
中的一个,其范围仅为嵌套类我的理解是您希望根据存储在其中的项目的属性对列表进行排序。您不需要额外的类,可以使用比较器。想象一下,你想根据属性字段对一些Item进行排序,你可以这样做:
class Item {
String property;
}
BSTree<Item> tree = ...;
tree.sort(new Comparator<Item> () {
public int compare(Item o1, Item o2) {
//you should handle the null case
return o1.property.compareTo(o2.property);
}
}
在你的BSTree中,你需要使用提供的比较器来实现那个排序操作。
现在,您可以将比较器声明为静态变量,只要您希望它能够在需要时重复使用它。