使用静态比较器对BSTree进行排序

时间:2013-01-14 07:20:55

标签: java generics comparator

我有一些学校工作,我有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);
        }
    }
}

2 个答案:

答案 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中,你需要使用提供的比较器来实现那个排序操作。

现在,您可以将比较器声明为静态变量,只要您希望它能够在需要时重复使用它。