如何检查反转比较器和原始的相等?

时间:2014-11-24 20:11:36

标签: java equals reverse comparator

Pre-TL; DR:需要查看比较器是否是另一个比较器的实例(或等于),即使它是相反的。

你好,我认为这个问题非常简单,但我只是想太多了。 我有一个程序,允许用户按不同的比较器对列表进行排序。用户可以选择升序或降序。由于比较器默认按升序排列,所以我所做的只是按降序创建一个新的反向比较器:

Comparator newReversedCMP = Collections.reverseOrder(Comparator originalComp)

程序的另一部分保存最后使用的比较器,以便用户可以对最后使用的比较器进行排序或查看。假设我有处理名称和工资的比较器以及返回其处理内容的方法,例如:

if (lastCMPUsed.equals(new NameComparator()){
    return "Name";
}
if (lastCMPUsed.equals(new SalaryComparator()){
    return "Salary";
}

对于长篇介绍感到抱歉,但我的问题是,即使它与原始名称或工资比较器相反,我也想返回“名称”或“薪水”。如果lastCMPUsed是reverseOrder CMP,那么它找不到它们。

我试过这个但没有成功:

//lastCMPUsed = Collections.reversedOrder(new NameComparator()); if (lastCMPUsed.equals(Collections.reverseOrder(new NameComparator()) return "Name";

这不会返回“名称”并将其视为不相等。 我在每个比较器中的equals方法是一个简单的检查实例。

感谢阅读。

1 个答案:

答案 0 :(得分:0)

除了the supertype定义的等式之外,如果你需要一些特定的相等定义,你应该编写一个能够为你正确执行此操作的类结构。

例如:

public abstract class PersonComparator implements Comparator<Person> {
    private final boolean isReversed;

    private PersonComparator(boolean isReversed) {
        this.isReversed = isReversed;
    }

    public boolean isReversed() {
        return isReversed;
    }

    @Override
    public int compare(Person lhs, Person rhs) {
        return isReversed ? compareImpl(rhs, lhs) : compareImpl(lhs, rhs);
    }

    public abstract String getComparison();
    protected abstract int compareImpl(Person lhs, Person rhs);

    public static final class Name extends PersonComparator {
        private Name(boolean isReversed) { super(isReversed); }
        @Override
        protected int compareImpl(Person lhs, Person rhs) {
            return lhs.getName().compareTo(rhs.getName());
        }
        @Override
        public String getComparison() {
            return "Name";
        }
    }

    public static final Name NAME         = new Name(false);
    public static final Name NAME_REVERSE = new Name(true);
}

这里的平等是:

NAME.getClass() == NAME_REVERSE.getClass()    // true
NAME instanceof PersonComparator.Name         //
    &&                                        // true
NAME_REVERSE instanceof PersonComparator.Name //
NAME == NAME_REVERSE                          // false
NAME.equals(NAME_REVERSE);                    // false
NAME.getComparison()                          //
    .equals(NAME_REVERSE.getComparison())     // true

请注意,我不需要覆盖equalshashCode,因为每个可能的比较器只有一个实例。