Comparator / Comparable / ComparatorChain问题

时间:2012-06-23 22:28:22

标签: java interface comparable subclass apache-commons-collection

我正在努力实现一个处理ComparatorComparable接口的层次结构。我不清楚的几件事情:

  1. 如果我将比较器添加到比较器链中,这段代码究竟是什么意思

    chain.addComparator(new sortByTitle());

    我知道sortByTitle()参数必须是比较器,但我不明白你是如何实现这样的函数的?比较器要求你实现compare(obj1, obj2)函数,该函数接受两个参数来比较一个参数,你如何从一个(看起来像一个构造函数)调用没有参数?

    < / LI>
  2. 假设我实现了一个名为Database的类,它将一些项目存储在名为ArrayList的{​​{1}}中。变量item本身就是一个私有变量。现在在主程序中,进行如下调用:

    item

    如何直接访问Collections.sort(library.item, chain);实例?数据库规范指出item需要私有,这可以吗?

  3. 我将不胜感激。

1 个答案:

答案 0 :(得分:4)

  • 您可能知道,Comparator本身就是一个界面。当你    说chain.addComparator(new sortByTitle());,你正在传递    用于对对象进行排序的Comparator实现的实例    按标题。在这种情况下,sortByTitle类将实现    Comparator并将提供实施    compare(obj1, obj2)方法。您的链可以在其上调用    你传入的实例。通常,不是每次传递一个新实例,而是一个所有Comparator实现 Object被声明为Object的公共静态最终成员 本身。

例如:

public static final Comparator TITLE_COMPARATOR = new Comparator() {
    @Override
    public int compare(Object lhs, Object rhs) {
        // comparison logic
    }
};

然后您可以通过这种方式将它们传递到您的链中:

chain.addComparator(YourObject.TITLE_COMPARATOR);

这有一个额外的好处,即允许比较器(无状态)在别处使用,而不是每次都创建一个新实例。

  • 你需要在Library类中编写getter和setter(如果你愿意,可以使用访问器和mutators),这将允许item变量被其他类读取/更新,即使它被声明为private。

类似的东西:

public List getItem() {
    return item;
}

public void setItem(List item) {
    this.item = item;
}

在图书馆课程中。