【发布时间】:2015-12-27 14:40:39
【问题描述】:
我正在尝试使用以下比较器,但我很少但始终收到“比较方法违反一般合同”的错误。我已经尝试过多次调试,但始终未能找到根本原因 - 这里有什么明显的问题吗?
Collections.sort(ArrayListOfMyObjects, new Comparator<MyObject>() {
public int compare(MyObject lhs, MyObject rhs) {
boolean lhsBool = lhs.getBooleanValueOfVariable;
boolean rhsBool = rhs.getBooleanValueOfVariable;
if (lhsBool && !rhsBool) {
return -1;
} else if (!lhsBool && rhsBool) {
return 1;
}
// objects have no booleans defined
else {
if (appGpsLocation == null) {
String lhsString = lhs.getStringValueOfVariable();
String rhsString = rhs.getStringValueOfVariable();
return lhsString.compareTo(rhsString);
} else {
float lhsFloat = lhs.getFloatValueOfVariable();
float rhsFloat = rhs.getFloatValueOfVariable();
int result = Float.compare(lhsFloat, rhsFloat);
return result;
}
}
}
});
编辑:
• (!useStrings) 转换为 -> (appHasGpsLocation == null)
• 对象方法名称更改为与 java 方法更加不同
【问题讨论】:
-
这个:lhs.getObjectBoolean;已经没有意义了。请不要给变量方法名。
-
这只是为了使数据类型明显的伪代码 - 我的实际变量名称当然不同。
-
useStrings是如何初始化的? -
那是什么?静态场?实例字段?
-
好的,这就引出了一个问题:
appGpsLocation是什么?静态字段?实例字段?它是如何初始化的?在比较对象时它会改变吗?
标签: java android comparator