簡體   English   中英

如何檢查反向比較器和原始比較器的相等性?

[英]How to check equality of reversed comparator and original?

TL; DR之前版本:即使比較器是反向的,也需要查看它是否是另一個比較器的實例(或等於)。

您好,我認為這個問題很簡單,但是我想的太多了。 我有一個程序,允許用戶通過不同的比較器對列表進行排序。 用戶可以選擇升序或降序。 由於默認情況下比較器是按升序排列的,因此,為了實現降序排列,我要做的就是創建一個新的反向比較器:

Comparator newReversedCMP = Collections.reverseOrder(Comparator originalComp)

程序的另一部分保存最后使用的比較器,以便用戶可以排序或查看最后使用的比較器。 假設我有一個處理名稱和薪水的比較器,以及一個返回其處理內容的方法,例如:

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

很長的介紹很抱歉,但是我的問題是我也想返回“名稱”或“薪水”,即使它與原始名稱或薪水比較器相反。 如果lastCMPUsed是reversedOrder CMP,則不會發現它們相等。

我已經嘗試過,但是沒有成功:

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

這不會返回“名稱”,並且會認為它們不相等。 每個比較器中的equals方法都是一個簡單的checkof實例。

謝謝閱讀。

如果除類定義的定義之外還需要一些特定的相等定義,則應編寫一個類結構,該結構將為您正確地進行此操作。

例如:

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 ,因為每個可能的Comparator只有一個實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM