java - Comparator/Comparable/ComparatorChain问题

标签 java interface comparable subclass apache-commons-collection

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

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

    chain.addComparator(new sortByTitle());

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

  2. 假设我实现了一个名为 Database 的类,该类将一些项目存储在名为 itemArrayList 中。变量 item 本身就是一个私有(private)变量。现在在主程序中,进行如下调用:

    Collections.sort(library.item, chain);

    如何直接访问对象 libraryitem 实例?数据库规范规定 item 需要私有(private),这行得通吗?

如有任何帮助,我将不胜感激。

最佳答案

  • 您可能知道,Comparator 本身就是一个接口(interface)。当你 说 chain.addComparator(new sortByTitle());,你正在传递一个 对对象进行排序的 Comparator 实现的实例 按标题。 sortByTitle 类将在这种情况下实现 Comparator 并将提供 compare(obj1, obj2) 方法。你的链可以调用它 你传入的实例。通常,不是每次都传递一个新实例,而是所有 Comparator 实现 对象被声明为对象的 public static final 成员 本身。

例如:

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(访问器和修改器,如果您愿意),这将允许其他类读取/更新 item 变量,即使它被声明为私有(private)。

类似于:

public List getItem() {
    return item;
}

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

在库类中。

关于java - Comparator/Comparable/ComparatorChain问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11173477/

相关文章:

generics - Swift 中符合 Comparable 的泛型类

java - 一致的 Equals() 结果,但不一致的 TreeMap.containsKey() 结果

程序完成后 Java 挂起一分钟

delphi - 如何将 Variant 转换为 TADOConnection.ConnectionObject?

c# - 禁止现有类的接口(interface)实现有什么好处吗?

c# - 使用接口(interface)分离读写关注点的最佳方法?

java - 由于使用了 Observable List,Gson 无法反序列化

java - 带指针的C结构,如何Swig?

java - java中如何获取uint32_t对应的唯一值?

java - 像java中的基本类型一样比较对象