Collections.sort() 比较方法违反了 Java 中的一般约定[重复]

2024-01-18

我知道这种问题已经被问过数百万次(如果不是数十亿次),但我还找不到答案:)

This compare()方法没有Long, Double, Float, ..., 它只有Date, boolean, and Null检查员,但是它告诉我contract violation error,有人可以帮忙吗?

Collections.sort(users, new Comparator<MiniUser>() {
        @Override
        public int compare(MiniUser u1, MiniUser u2) {
            boolean resComing = checkMatchConditions(u1,user);
            boolean resExists = checkMatchConditions(u2,user);

            if(Boolean.valueOf(resComing) && Boolean.valueOf(resExists)) {
                if(u1.getLastMatchDate() == null){
                    return -1;
                }else if(u2.getLastMatchDate() ==null ){
                    return 1;
                }else if (u1.getLastMatchDate().toInstant().isBefore(u2.getLastMatchDate().toInstant())){
                    return -1;
                }else {
                    return 1;
                }
            }

            else if (Boolean.valueOf(resComing)) {
                return -1;
            }
            return 1;
        }

    });

迷你用户类

public class MiniUser implements Serializable {

    String id;
    String name;
    Date lastMatchDate;
    boolean showCompleteName;

//getters, setters
}

checkMatchConditions根据一些计算返回布尔值


您应该首先阅读Comparator.compare() 的 JavaDoc https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#compare-T-T-了解“合同”是什么:

实现者必须确保 sgn(compare(x, y)) == -sgn(compare(y, x)) 对于所有 x 和 y。

一般来说,它表示如果“x 大于 y,则 y 必须小于 x”。听起来很明显,但在您的比较器中情况并非如此:

  • 在你的情况下,当两个用户有checkMatchConditions false, 在这种情况下compare(u1, u2) and compare(u2, u1)两者都返回 1。因此,在某些情况下u1大于u2, and u2大于u1,这是一种违规行为。
  • 同样,如果两个用户都有checkMatchConditions true,以及他们的lastMatchDates都是null,他们也会违反合同。
  • 此外,因为您手动尝试将日期与isBefore,当两个用户有两种情况时,您也会返回 -1checkMatchConditions true和他们的lastMatchDates两者相等。

为了解决这个问题,您应该首先添加自然语言描述,说明您希望如何对用户进行排序。然后你就可以计算出比较器逻辑。

该错误与以下内容无关Boolean.valueOf()顺便一提。


现在您已经解释了如何订购,请看一下这个比较器:

public int compare(MiniUser u1, MiniUser u2)
{
    // order by match
    boolean u1Matches = checkMatchConditions(u1, user);
    boolean u2Matches = checkMatchConditions(u2, user);

    if (u1Matches != u2Matches)
    {
        // put matching ones first
        return u1Matches ? -1 : 1;
    }
    else if (u1Matches)
    {
        // order by dates
        boolean u1HasDate = u1.getLastMatchDate() != null;
        boolean u2HasDate = u2.getLastMatchDate() != null;

        if (u1HasDate != u2HasDate)
        {
            // put the ones without date first
            return u1HasDate ? 1 : -1;
        }
        else if (u1HasDate)
        {
            // order chronologically
            return u1.getLastMatchDate().compareTo(u2.getLastMatchDate());
        }
        else
        {
            // no dates, no order possible
            return 0;
        }
    }
    else
    {
        // both don't match, no order possible
        return 0;
    }
}

如果我正确理解您的要求,这应该对您的元素施加一致的顺序。注意我的使用方式Date's compareTo日期订购而不是自己做,以及我如何返回0如果它们在顺序上“相等”而不是“随机”返回1 or -1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Collections.sort() 比较方法违反了 Java 中的一般约定[重复] 的相关文章

  • 光学标记阅读器的开源库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个用于光学标记读取 OMR 的开源库 有这样的库吗 我想在我的 java 应用程序中使用这个库 zxing 可能对你有用 http
  • 如何安装 C++ 的 VOCE?

    我正在尝试安装 VOCE api 它是为 C 和 Java 构建的语音识别 API 这是我第二次使用外部 C 库 也是第一次使用 Java C api 语音链接 http voce sourceforge net http voce sou
  • Infinispan 复制缓存不复制对象以供读取

    我们正在尝试在 Openshift 内的 Wildfly 11 上运行的两个 infinispan 节点上安装复制缓存 当我们在一个节点上写入一个对象时 它不会显示在另一节点上进行读取 启动时 节点在集群中连接 并且可以看到彼此 如日志中所
  • 使用 Hibernate 或 Spring 打印 DBMS_OUTPUT.put_line

    我想知道 Hibernate 或 Spring 或任何第 3 方库是否提供将 DBMS OUTPUT put line 消息直接打印到 system out 或日志文件的能力 目的是在控制台中同时显示 PLSQL 日志消息和 java 日志
  • 如何在 Java 中根据 XSD 1.1 验证 XML?

    在 Java 中根据 XML Schema 1 1 验证 XML 文件的最佳方法是什么 我从中获取了代码tutorial http www ibm com developerworks xml library x javaxmlvalida
  • java“类文件包含错误的类”错误

    我正在尝试制作一个控制台应用程序来测试我的网络服务 我成功部署了一个网络服务http localhost 8080 WS myWS http localhost 8080 WS myWS我用 wsimport 制作了代理类 wsimport
  • java中main的返回类型

    我想知道为什么java中main方法只有void返回类型 public static void main String args 为什么main方法除了void之外没有其他返回类型 Thanks 简短的回答是 因为这就是语言规范 http
  • MAC OS 的 java.awt.Robot 类中出现无头环境错误

    我正在尝试使用 JavaFX 应用程序捕获屏幕截图Robot class 这是我在我的应用程序中使用的代码 Rectangle screenBounds new Rectangle Screen getPrimary getBounds g
  • AIX:IBM Java:java.net.SocketException:连接超时:可能是由于地址无效

    当尝试与我们的服务器建立 SSL 连接时 我们在 IBM AIX 上经常看到以下异常 java net SocketException Socket closed at com sun net ssl internal ssl SSLSoc
  • Java中通过FTP创建文件夹层次结构

    Java 是否有现成的功能可以在远程 FTP 服务器上创建文件夹层次结构 Apache Commons 确实提供了 FTP 客户端 但我找不到创建目录层次结构的方法 它确实允许创建单个目录 makeDirectory 但创建整个路径似乎并不
  • 使用java读取Excel工作表的单列

    我有一张 Excel 表格 我想编写一个方法 该方法将参数作为要读取的列号 并返回一个由该列中的所有数据组成的数组 然后将该列元素放置在 xml 工作表中 我怎样才能编写一个方法来做到这一点 使用 Apache POI 您可以在他们的使用页
  • Apache HttpClient 执行时会在所有 HTTP 5XX 错误上抛出 IOException 吗?

    The Apache HttpClient 文档 http hc apache org httpcomponents client ga httpclient apidocs org apache http client HttpClien
  • 在同一台计算机上设置 JBoss 的多个实例

    我在 JBoss 社区中找到了下一页 http www jboss org community wiki ConfigurePorts http www jboss org community wiki ConfigurePorts 有下一
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • JTable中动态加载大量数据

    这是我的问题 我目前有一个 JTable 其中包含 5 000 到超过 200 000 行 你知道我要说什么了 数据已经加载到内存中了 这不是问题 但是如何 我可以创建一个高效的 JTable 以便它只加载以下行 是可见的 并且任何事件仅作
  • Java Calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY),它会向后滚动、向前滚动还是未知?

    假设以下代码在 2009 年 8 月 22 日 星期六 执行 Calendar c Calendar getInstance c set Calendar DAY OF WEEK Calendar SUNDAY c get Calendar
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • Spring 和 Hibernate 连接池

    如何使用 Spring 和 Hibernate 配置连接池 Thanks Venu 您可以使用 DBCP 组件
  • 生成签名和加密的 JWT

    我正在尝试使用生成签名和加密的 JWT 令牌雨云智威汤逊 http connect2id com products nimbus jose jwt private void generateToken throws JOSEExceptio

随机推荐

  • Flash 功能中的冲突检测? (命中测试对象)

    你好 所以我最近一直在使用hitTestObject检测我正在制作的 Android 应用程序中的碰撞 经过一番测试后 我意识到游戏正在检测 假 碰撞 我的意思是它正在检测碰撞not当物体的像素接触时 但是 经过一些研究后 我发现boxes
  • 如何让每个
  • 标签一个接一个地慢慢出现
  • 我希望当页面加载时列表项慢慢地一个接一个地出现在屏幕上 这是jquery中的代码 我使用过show 但它不起作用 我确实在这里查找问题 其中一些正在使用附加方法 但这不是我要寻找的 html ul li A li li B li li C
  • Angular 4自带的form element组件

    我是角度初学者 我可能需要一些帮助 首先 我将展示它如何工作 然后我将写下我希望它如何工作 这是使用 ngModel 时的常规方式
  • 如何在具有可变宽度 Unicode 字符的 Swift 字符串上使用 NSRegularExpression?

    我无法获取NSRegularExpression匹配字符串中含有较宽 Unicode 字符的模式 看起来问题出在范围参数上 Swift 计算单个 Unicode 字符 而 Objective C 将字符串视为由 UTF 16 代码单元组成
  • 如何使用CPU在深度睡眠模式下执行任何操作

    我是新来的android 我花了大约三个星期的时间来处理我的申请 我需要在正常模式下发送和接收数据包sleep mode My app必须交换数据 5 秒 我尝试使用alarmmanager但在 android 5 上它不起作用 在andr
  • MongoDB InvalidDocument:无法对对象进行编码

    我正在使用 scrapy 来抓取博客 然后将数据存储在 mongodb 中 起初我得到了 InvalidDocument 异常 对我来说很明显的是数据的编码不正确 因此 在持久化对象之前 在我的 MongoPipeline 中 我检查文档是
  • 如何合并数组并保留键?

    我有两个数组 array1 array a gt 1 b gt 2 c gt 3 array2 array d gt 4 e gt 5 f gt 6 a gt new value 123 gt 456 我想合并它们并保留键和顺序而不是重新索
  • Xcode 在打字时滚动文本

    Xcode 今天似乎做了一些烦人的事情 我喜欢编辑源代码 这样我就可以在 Xcode 窗口的垂直中心大致输入内容 我不喜欢在窗口底部或顶部附近键入 因为它隐藏了我正在忙于编辑的代码之前或之后的代码 最近 在编辑实现文件时 Xcode 习惯于
  • Oracle CONNECT BY 递归子到父查询,包括自引用的最终父级

    在下面的例子中 id parent id A A B A C B select id parent id from table start with id A connect by nocycle parent id prior id I
  • 在 Access 中导入 .sql 文件

    我需要导入使用 MySql 创建的 sql 数据库备份文件 有办法执行此操作吗 您无法将 MySQL 备份恢复到任何其他数据库系统中 如果要将 MySQL 数据导入到 Access 中 可以将其全部导出到 CSV 文件中 然后将其导入到 A
  • UWP TextBox 文本绑定不起作用

    我在 UWP 中使用 TextBox Text 绑定时遇到一些问题 我已经从事 WPF 多年 通常知道我在 XAML 中做什么 但无法让此绑定发挥作用 我在 XAML 中的同一范围内有一个文本框和一个按钮
  • 如何避免打开两个浏览器窗口?

    我想避免打开两个应用程序窗口 或选项卡 的可能性 是的 如果我的应用程序 LAMP Javascript 安装在http www domain com并且用户正在浏览页面http www domain com user 他 她无法打开另一个
  • 是否可以将 .Net DLR 托管在“防白痴”沙箱中?

    我想以这样一种方式托管动态语言运行时 DLR 以便在其中运行任意脚本的用户无法关闭该进程 The DLR 托管规范 https web archive org web 20110814193317 http dlr codeplex com
  • pthread_create() 的返回码是 11

    我正在尝试运行一个简单的多线程编程 但我从 gcc 收到此错误 pthread create 的返回码是 11 我该如何解决这个问题 include
  • 平面图布局

    布局图形时有哪些边缘重叠最小化技术 最好与 GraphViz 相关 还有现有的软件可以以平面方式布局图形吗 当前布局 http www evecakes com doodles master gif http www evecakes co
  • PHP 中奇怪的回显、打印行为?

    以下代码输出43211 why echo print 3 2 print 4 你的语句解析对人类如下 回显由以下内容组成的串联字符串 函数的结果print 3 这将返回 true 它被字符串化为1 字符串 2 函数的结果print 4 这将
  • 如何在子流程中包含弹出对话框

    有没有办法在子流状态内调用对话框 以便禁用背景 当前流 这样当子流程结束时 关闭弹出对话框后 它就可以更新父流程 当前页面 我正在尝试使用子流程实现如下图所示的效果 Update 最后 我在 webflow 中使用了以下代码来动态生成对话框
  • amphp 是如何工作的

    他们网站上的文档http amphp org faq http amphp org faq我不太清楚 事情让我很困惑 它打算作为服务器运行吗 或作为 CLI 运行 或者在 Web 容器 apache nginx fpm 中运行 php 本质
  • 收到错误:图形 API 版本不匹配

    当我运行时出现以下错误shiny Error Graphics API version mismatch Listening on http 127 0 0 1 3774 Warning Error in Cairo Graphics AP
  • Collections.sort() 比较方法违反了 Java 中的一般约定[重复]

    这个问题在这里已经有答案了 我知道这种问题已经被问过数百万次 如果不是数十亿次 但我还找不到答案 This compare 方法没有Long Double Float 它只有Date boolean and Null检查员 但是它告诉我co