我有一个具有多个属性的对象,用户可以选择其中的两个属性,二者都可以是升序,降序或两者都不是(“正常”),并且它们彼此独立。所以我的情况是:
情况1
propA-正常
propB-正常
情况二
propA-Asc
propB-正常
情况3
propA-描述
propB-正常
这样您就知道了。我正在使用Comparator
进行此操作,到目前为止,当一个或两个值都设置为Normal
时,我已经能够对其进行排序。我不确定的部分是选择两种方法进行排序时的处理方式。例如,如果我想按propA升序和propB降序排序,它应该看起来像这样
propA propB
A Z
A D
B M
B A
R Q
Z Z
Z A
这是我现在的排序方式
@Override
public int compare(Field lhs, Field rhs) {
switch (growerSort) {
case NORMAL:
switch (fieldSort) {
case NORMAL:
return ((Integer) lhs.getID()).compareTo(rhs.getID());
case ASC:
return lhs.getPropB().toLowerCase().compareTo(rhs.getPropB().toLowerCase());
default:
return rhs.getPropB().toLowerCase().compareTo(lhs.getPropB().toLowerCase());
}
case ASC:
switch (fieldSort) {
case NORMAL:
return lhs.getPropA().toLowerCase().compareTo(rhs.getPropA().toLowerCase());;
case ASC:
return 0; // 0 used as placeholder
default:
return 0; // 0 used as placeholder
}
default:
switch (fieldSort) {
case NORMAL:
return rhs.getPropA().toLowerCase().compareTo(lhs.getPropA().toLowerCase());
case ASC:
return 0; // 0 used as placeholder
default:
return 0; // 0 used as placeholder
}
}
}
如何对两个不同的字段进行排序,每个字段都有各自的排序顺序?
最佳答案
我对您的Comparator
感到有些困惑。要了解什么开关会触发什么事件并不容易。
但是,我将描述标准过程。
您需要对要比较的字段进行优先排序。在上面的示例中,我假设必须首先按propA
,然后按propB
对其进行排序。
然后,您首先按propA
排序。如果返回“等于”(零),则要按下一个字段propB
进行排序,依此类推。
让我给你看一个例子:
@Override
public int compare(final Field lhs, final Field rhs) {
int firstCompareValue = lhs.getPropA().compareTo(rhs.getPropA());
if (firstCompareValue == 0) {
// lhs and rhs are equals in propA, use propB
int secondCompareValue = lhs.getPropB().compareTo(rhs.getPropB());
return secondCompareValue;
} else {
return firstCompareValue;
}
}
当然,如果您有多个字段,也可以进行此迭代,只要您指定了顺序即可(例如,通过在属性字段上使用有序列表)。
现在,您需要将开关添加到此展示柜中:)我建议为此做一个
PropertyComparator
。public final class PropertyComparator extends Comparator<Comparable<?>> {
private final boolean mUseDscOrder = false;
public void setUseDscOrder(final boolean useDscOrder) {
mUseDscOrder = useDscOrder;
}
public int compare(final Comparable<?> o1, final Comparable<?> o2) {
if (!mUseDscOrder) {
return o1.compareTo(o2);
} else {
// Reverses the logic, results in DscOrder
return o2.compareTo(o1)
}
}
}
现在在上面的
Comparator
中使用它。@Override
public int compare(final Field lhs, final Field rhs, final boolean firstUseDscOrder, final boolean secondUseDcsOrder) {
PropertyComparator firstComparator = new PropertyComparator();
firstComparator.setUseDscOrder(firstUseDscOrder);
int firstCompareValue = firstComparator.compare(lhs.getPropA(), rhs.getPropA());
if (firstCompareValue == 0) {
// lhs and rhs are equals in propA, use propB
PropertyComparator secondComparator = new PropertyComparator();
secondComparator.setUseDscOrder(secondUseDscOrder);
int secondCompareValue = secondComparator.compare(lhs.getPropB(), rhs.getPropB());
return secondCompareValue;
} else {
return firstCompareValue;
}
}
我没有测试过,但是我想你明白了:)