1

我在上课的地方有一些学校作业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);
        }
    }
}
4

2 回答 2

2

可能有点跑题了,但我认为值得一看。

您的比较器根本没用。通常我们需要一个 Comparator,因为要比较的目标对象不是 Comparable,或者默认的比较不适合我们的使用。

但是,如果您只是简单地制作一个具有 E 限制的 Comparator 扩展 Comparable ,并且比较逻辑是 simple return a.compareTo(b),那么为什么不直接比较呢?就像是

public class BSTree<E extends Comparable> extends BTree<E>{
}

您的排序只需使用 Comparable#compareTo 方法。

如果您想选择性地让用户提供 Comparator,请参考 TreeMap 中的方式。基本思想是,如果提供了比较器,则使用比较器,如果没有,则将条目转换为 Comparable,然后进行比较。


如果你坚持使用 Comparator (这就是你在评论中提到的,虽然我不明白背后的原因),因为你需要你的元素是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);
        }
    }
}

它看起来很奇怪,但这就是你所要求的。

于 2013-01-14T08:51:16.167 回答
1

您的代码有点棘手,因为您定义了两个E

  • 一个 in BSTree<E>,静态变量comp使用:无法编译,因为E仅在实例级别知道并且不能在静态上下文中使用。
  • one in 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 中,您需要使用提供的比较器来实现该排序操作。

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

于 2013-01-14T07:38:42.100 回答