[英]How to fix compiler issues while using Comparator.reversed()
[英]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
注意,我不需要重寫equals
和hashCode
,因為每個可能的Comparator只有一個實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.