【问题标题】:Comparison method violates general contract比较法违反总合同
【发布时间】: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


【解决方案1】:

假设appGpsLocationsort 期间没有更改,那么该方法将维护合同。但是如果appGpsLocationsort期间改变,那么它可能不会,因为突然它使用不同的信息来确定对象的关系,所以a.compare(b)b.compare(a)可能如果appGpsLocation 在它们之间更改,则不会啮合。

【讨论】:

  • 非常感谢 - 这个错误已经困扰我大约一年了。我将 appGpsLocation 设置为在调用排序之前初始化的局部变量,然后在排序过程中它的值不能改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多