3

我正在实施一个处理ComparatorComparable接口的层次结构。事情是我不清楚夫妇:比较器/比较/比较器链接问题

  1. 如果我加入比较来比较链,究竟是什么这一段代码的意思是

    chain.addComparator(new sortByTitle());

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

  2. 假设我实现了一个名为Database的类,它在ArrayList中存储了一些名为item的项。变量item本身就是一个私有变量。现在,在主程序中,这样的调用时:

    Collections.sort(library.item, chain);

    怎么可能直接访问对象库的item的实例?数据库规范规定item需要保密,这可以工作吗?

我将不胜感激任何帮助。

回答

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

例如:

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

然后,您可以简单地将它们传递到您以这种方式链条:

chain.addComparator(YourObject.TITLE_COMPARATOR); 

这具有允许比较(这是无状态的)的添加benifit在其他地方使用,而不是每次都创建一个新实例。

  • 您需要(如果你喜欢存取函数)来写getter和setter在图书馆类,这将使该项目的变量进行读/其它类更新,即使它被声明为private。

喜欢的东西:

public List getItem() { 
    return item; 
} 

public void setItem(List item) { 
    this.item = item; 
} 
在图书馆类

+0

感谢您的帮助。 – Mike