为什么我的compareTo崩溃了一般合同违规错误?

时间:2016-10-21 15:19:45

标签: java android date compare comparator

我正在尝试按@Configuration public class Configuration { @Bean public DataSource dataSource() { ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null); PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory); ObjectPool objectPool = new GenericObjectPool(poolableConnectionFactory); PoolingDataSource dataSource = new PoolingDataSource(objectPool); return dataSource; } 对象的NewsAdapter属性对自定义Date进行排序,我注意到在数据集较大的情况下,我的应用程序崩溃了Articles_Map错误。

我不确定是否因为java.lang.IllegalArgumentException: Comparison method violates its general contract!溢出而发生错误,或者它确实与合同的传递属性有关。特别是对于后者,我不知道如何解决它,因为据我所知,我已经处理了3种可能的结果(小于0,0,大于0)。

int

3 个答案:

答案 0 :(得分:3)

如果ComparatorpublishedAt,则null违反了传递性要求。

假设您有三个Articles_Map实例:

  • a - 值为publishedAt
  • b - publishedAt == null
  • c - publishedtAt的值大于a的值

现在,如果您使用abbc来呼叫您的比较器,则比较器将为这两个呼叫返回0

要满足传递性规则,如果使用0a调用比较器,则比较器也必须返回c。但由于两个对象上的字段publishedAt不是null,如果按照说明准备,它将返回小于0的值。

要解决此问题,如果0o1.publishedAt中只有一个o2.publishedAt,则您的比较器不得返回null

例如:

private static final Comparator<Articles_Map> byPublishedAtComparator =
        new Comparator<Articles_Map>() {
            @Override
            public int compare(Articles_Map o1, Articles_Map o2) {
                // needs further testing in case of nulls
                if (o1.publishedAt == null) {
                    return (o2.publishedAt == null) ? 0 : -1;
                } else if (o2.publishedAt == null) {
                    return 1;
                }

                return o1.publishedAt.compareTo(o2.publishedAt);
            }
        };

答案 1 :(得分:1)

考虑以下三个实例:

A1 = Articles_Map{publishedAt = 1, ...)
A2 = Articles_Map{publishedAt = null, ...)
A3 = Articles_Map{publishedAt = 2, ...)

compare(A1, A2) -> 0
compare(A2, A3) -> 0
compare(A1, A3) -> -1  

违反合同......并没有意义。 (如果A1等于A2且A2等于A3,则A1应等于A3!)

解决方案是将null视为等同于特定数值;例如如果Integer.MIN_VALUEpublished_at,则int

答案 2 :(得分:0)

将此变量转换为类似的类:

private class byPublishedAtComparator implements Comparator<Articles_Map> {
    @Override
    public int compare(Articles_Map o1, Articles_Map o2) {
        if (o1.publishedAt == null || o2.publishedAt == null) {
            return 0;
        }
        return o1.publishedAt.compareTo(o2.publishedAt);
    }
}

而是this.sort(byPublishedAtComparator);,您必须致电

Collections.sort(yourArray, new byPublishedAtComparator());