java - 当提供自定义比较器或元素实现 Comparable 时,如何拆分方法中的逻辑?

标签 java collections comparator comparable

在方法中分离逻辑的最佳实践是什么,谁将使用 Comparable 元素,或者在创建时提供特定的 Comparator,具体取决于使用的类的构造函数? 示例:

public class MinMax<E> {

private final Comparator<? super E> comparator;
private final boolean isSpecificComparatorProvided;

public MinMax() {
    this.comparator = null;
    this.isSpecificComparatorProvided = false;
    ........;
}

public MinMax(Comparator<? super E> comparator) {
    this.comparator = comparator;
    this.isSpecificComparatorProvided = true;
    ........;
}

private boolean isBigOrEqual(E e1, E e2) {
    if (isSpecificComparatorProvided) {
        Comparator<? super E> cpr = comparator;
        int cmpr = cpr.compare(e1, e2);
        return cmpr > -1;
    } else {
        @SuppressWarnings("unchecked")
        Comparable<? super E> e1Comparable = (Comparable<? super E>) e1;
        int cmprTo = e1Comparable.compareTo(e2);
        return cmprTo > -1;
    }
}

}

我是否始终在 isBigOrEqual() 方法中检查特定比较器? 当没有提供特定的比较器时,是否还需要转换为 Comparable ? 还有其他方法吗?

最佳答案

处理这个问题的最简单方法可能是仅实现 Comparator 的情况,然后当您没有传递 Comparator 时,编写一个仅适用于 Comparable 的方法。 (在 Java 8 中,这只是 Comparator.naturalOrder()。)

new Comparator<T> {
  @Override public int compare(T a, T b) {
    return a.compareTo(b);
  }
};

TreeMap 出于性能原因不会这样做,但这样做更简单。

关于java - 当提供自定义比较器或元素实现 Comparable 时,如何拆分方法中的逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28497521/

相关文章:

java - 无需调用 Session 对象上的 save() 方法即可持久保存对象

Java boolean[] 到 byte[] 并返回

java - 集合的 toString() 方法中的 StackOverflowError 是一个错误吗?

c# - 为什么要使用 ICollection<T> 而不是 List<T>,如果我使用 ICollection<T>,那么如何使用 AddRange、Insert 和其他列表方法

java - 可以直接构造比较器吗?由于比较器是一个接口(interface),因此感到困惑。

java - Java 类可以模拟另一个 Windows 用户吗?

java - 使用集合比较字符串数组

c++ - C++ 中各种自定义比较器函数之间的差异

c++ - C++ Map 中结构键的比较运算符

java - 为什么我们必须为 @SuppressWarnings ("unchecked"使用中间变量)?