Java 如何检查反向比较器和原始比较器的相等性?

Java 如何检查反向比较器和原始比较器的相等性?,java,equals,reverse,comparator,Java,Equals,Reverse,Comparator,前TL;DR:需要查看一个比较器是否是另一个比较器的实例(或等同于另一个比较器),即使它是反向的 你好,我认为这个问题很简单,但我只是想得太多了。 我有一个程序,允许用户通过不同的比较器对列表进行排序。用户可以选择升序或降序。由于比较器默认为升序,所以我要实现降序所做的就是创建一个新的反向比较器: Comparator newReversedCMP = Collections.reverseOrder(Comparator originalComp) 程序的另一部分保存最后使用的比较器,以便用

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

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

Comparator newReversedCMP = Collections.reverseOrder(Comparator originalComp)
程序的另一部分保存最后使用的比较器,以便用户可以排序或查看最后使用的比较器。假设我有一个处理姓名和薪水的比较器,还有一个返回它所处理的内容的方法,例如:

if (lastCMPUsed.equals(new NameComparator()){
    return "Name";
}
if (lastCMPUsed.equals(new SalaryComparator()){
    return "Salary";
}
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);
}
抱歉这么长的介绍,但我的问题是,我还想返回“姓名”或“薪资”,即使它与原始姓名或薪资比较表相反。如果lastCMPUsed是反向顺序CMP,则它不会发现它们相等

我尝试过这一点,但没有成功:

//lastCMPUsed=Collections.reversedOrder(新的nameparator());
if(lastCMPUsed.equals)(Collections.reverseOrder(new nameparator())
返回“名称”;

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


感谢阅读。

如果您需要除由定义的定义之外的某个特定的等式定义,那么您应该编写一个类结构来正确地完成这项工作

例如:

if (lastCMPUsed.equals(new NameComparator()){
    return "Name";
}
if (lastCMPUsed.equals(new SalaryComparator()){
    return "Salary";
}
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);
}

请注意,我不需要重写
equals
hashCode
,因为每个可能的比较器只有一个实例。

好吧,它们基本上不是同一个比较器,所以当然
equals
不起作用。不过,像这样的逻辑似乎是一个不确定的设计;为什么不能存储字符串名称separately?为什么要创建一个新对象来检查?为什么不使用class属性?if(lastCMPUser.getClass().equals(NameComparator.class)甚至instanceofI,在尝试为这个问题提供示例代码时,我实际上解决了我的问题。我可能正在删除这个问题。if(lastCMPUsed.equals(Collections.reverseOrder(new NameComparator())返回“Name”;如果lastCMPUsed与namecomparatory相反,则此选项实际上有效。您不应该按照您描述的方式使用
equals
。它破坏了的约定,只有在顺序相同时才应返回true。
NAME == NAME_REVERSE                          // false
NAME.equals(NAME_REVERSE);                    // false
NAME.getComparison()                          //
    .equals(NAME_REVERSE.getComparison())     // true