Treeset.contains() 问题

2024-01-20

所以我已经被一个问题困扰了一段时间,我想我不妨在这里寻求帮助。

我将 Ticket 对象添加到 TreeSet,Ticket 实现 Comparable 并重写 equals()、hashCode() 和 CompareTo() 方法。我需要使用 contains() 检查一个对象是否已经在 TreeSet 中。现在,在向集合添加 2 个元素后,一切都检查正常,但在添加第三个元素后,它就变得混乱了。

在将第三个元素添加到 TreeSet 后运行这一小段代码,Ticket temp2 是我正在检查的对象(verkoopLijst)。

    Ticket temp2 = new Ticket(boeking, TicketType.STANDAARD, 1,1);
    System.out.println(verkoop.getVerkoopLijst().first().hashCode());
    System.out.println(temp2.hashCode());

    System.out.println(verkoop.getVerkoopLijst().first().equals(temp2));
    System.out.println(verkoop.getVerkoopLijst().first().compareTo(temp2));
    System.out.println(verkoop.getVerkoopLijst().contains(temp2));

返回这个:

22106622
22106622
true
0
false

现在我的问题是这怎么可能?

Edit:

public class Ticket implements Comparable{

    private int rijNr, stoelNr;
    private TicketType ticketType;
    private Boeking boeking;


    public Ticket(Boeking boeking, TicketType ticketType, int rijNr, int stoelNr){    
        //setters
    }

    @Override
    public int hashCode(){
        return boeking.getBoekingDatum().hashCode();     
    }

    @Override
    @SuppressWarnings("EqualsWhichDoesntCheckParameterClass")    
    public boolean equals(Object o){
       Ticket t = (Ticket) o;

       if(this.boeking.equals(t.getBoeking())
               &&
          this.rijNr == t.getRijNr() &&  this.stoelNr == t.getStoelNr()
               &&
          this.ticketType.equals(t.getTicketType()))
       {
           return true;
       }

       else return false;

    }

    /*I adjusted compareTo this way because I need to make sure there are no duplicate Tickets in my treeset. Treeset seems to call CompareTo() to check for equality before adding an object to the set, instead of equals().


     */
    @Override
    public int compareTo(Object o) {
        int output = 0;
        if (boeking.compareTo(((Ticket) o).getBoeking())==0)
        {
            if(this.equals(o))
            {
                return output;
            }
            else return 1;
        }
        else output = boeking.compareTo(((Ticket) o).getBoeking());
        return output;
    }

    //Getters & Setters

On compareTo合同

问题出在你的compareTo。这是摘录自文档 http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html:

实施者必须确保sgn(x.compareTo(y)) == -sgn(y.compareTo(x))对全部x and y.

此处转载您的原始代码以供参考:

// original compareTo implementation with bug marked

@Override
public int compareTo(Object o) {
    int output = 0;
    if (boeking.compareTo(((Ticket) o).getBoeking())==0)
    {
        if(this.equals(o))
        {
            return output;
        }
        else return 1; // BUG!!!! See explanation below!
    }
    else output = boeking.compareTo(((Ticket) o).getBoeking());
    return output;
}

为什么是return 1;一个错误?考虑以下场景:

  • Given Ticket t1, t2
  • Given t1.boeking.compareTo(t2.boeking) == 0
  • Given t1.equals(t2) return false
  • Now we have both of the following:
    • t1.compareTo(t2)回报1
    • t2.compareTo(t1)回报1

最后一个结果是违反 of the compareTo合同。


解决问题

首先也是最重要的一点,你应该利用以下事实:Comparable<T>是一个可参数化的泛型类型。也就是说,而不是:

// original declaration; uses raw type!
public class Ticket implements Comparable

声明这样的内容会更合适:

// improved declaration! uses parameterized Comparable<T>
public class Ticket implements Comparable<Ticket>

现在我们可以写我们的compareTo(Ticket)(不再compareTo(Object))。有很多方法可以重写它,但这里有一种相当简单的方法:

@Override public int compareTo(Ticket t) {
   int v;

   v = this.boeking.compareTo(t.boeking);
   if (v != 0) return v;

   v = compareInt(this.rijNr, t.rijNr);
   if (v != 0) return v;

   v = compareInt(this.stoelNr, t.stoelNr);
   if (v != 0) return v;

   v = compareInt(this.ticketType, t.ticketType);
   if (v != 0) return v;

   return 0;
}
private static int compareInt(int i1, int i2) {
   if (i1 < i2) {
     return -1;
   } else if (i1 > i2) {
     return +1;
   } else {
     return 0;
   }
}

现在我们还可以定义equals(Object)按照compareTo(Ticket)而不是相反:

@Override public boolean equals(Object o) {
   return (o instanceof Ticket) && (this.compareTo((Ticket) o) == 0);
}

注意结构compareTo: 有多个return陈述,但事实上,逻辑流程是相当可读的。另请注意如何priority排序标准是明确的,并且如果您有不同的优先级,则可以轻松重新排序。

相关问题

  • 什么是原始类型以及为什么我们不应该使用它? https://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it
  • 如何先按 x 然后按 y 对数组或 ArrayList ASC 进行排序? https://stackoverflow.com/questions/2741846/how-to-sort-an-array-or-arraylistpoint-asc-first-by-x-and-then-by-y
  • 一个函数应该只有一个 return 语句吗? https://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Treeset.contains() 问题 的相关文章

  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • 如何转义 YAML 字符串中的冒号和其他特殊字符?

    我有以下 YAML 片段 description API for bean consuming applications Examples painted pony lima bean 招摇编辑器 http editor swagger i
  • 函数调用的正则表达式?

    我只想从函数调用中提取一些引用的文本 并且想知道是否可以获得有关正则表达式的帮助 该字符串看起来像这样 MyFunction MyStringArg 本质上 我想扫描文件中任何调用 MyFunction 的行 然后捕获引号内的字符串文字 后
  • 使用正则表达式验证数学表达式?

    我想使用正则表达式验证数学表达式 数学表达式可以是这样的 可以为空 表示没有输入任何内容 如果指定 它将始终以运算符开头 or or or 并且后面总是跟着一个可以有的数字 任意位数且数字可以是小数 包含 数字之间 或整数 数字中没有 符号
  • 使用 if 语句检查 mousedown 是否有效?

    是否可以做这样的事情 if this mousedown true 我以为这会起作用 但事实并非如此 额外细节 我试图检查当鼠标离开特定位置时鼠标按钮是否按下DIV 因此如果用户在鼠标离开 div 时按住鼠标按钮 则执行此操作 否则执行此操
  • EditText 不接受数字输入

    我的 Android 应用程序中有一个 EditText 视图 我的 EditText 不采用整数值作为输入 但它采用所有其他值 以下是我的 EditText 视图
  • 对齐子图中的 ylabel

    我有几个子图 一个在另一个下 每个子图的 y 轴都标有不同的值 比如第一个是 1 5 第二个是 10 1000 等 所以结果是每个 ylabel 都会有不同的对齐方式 有没有办法来解决这个问题 例如 将所有 ylabel 向左对齐 或者还有
  • 为什么 eval 是邪恶的?

    我知道Lisp和Scheme程序员通常会这么说eval除非绝对必要 否则应避免 我已经看到了对几种编程语言的相同建议 但我还没有看到反对使用的明确论据列表eval 在哪里可以找到使用潜在问题的说明eval 例如 我知道以下问题GOTO在过程
  • 卷曲:连接被拒绝

    运行curl时出现以下错误 curl 7 连接127 0 0 1端口8080失败 连接 拒绝了 看起来很容易调试 但是 我没有找到如何解决它 文件中提到了地址127 0 0 1etc hosts 我在Ubuntu系统上使用curl版本7 4
  • 如何从 Sinch 应用仪表板删除上传的 APNS 证书?

    我们正在开发呼叫应用程序使用新奇SDK 我想从 Sinch Dashboard 中创建的应用程序中删除上传的 APNS 证书 我没有找到任何方法来从中删除现有的上传证书 NOTE 现在sinch在App上传的认证附近提供了 删除 选项 No
  • 如何使用java脚本向“go服务器”(go语言)发送json请求并接收json响应

    如何使用java脚本发布json请求并从 go服务器 go语言 接收json响应 我试过这个 JavaScript 代码 var calculate operand1 null operand2 null operator null fun
  • 内核中的地址

    当我在内核中找到地址时 我有一个问题 我在内核中插入一个 hello 模块 在这个模块中 我放置了这些东西 char mystring this is my address printk lt 1 gt The address of mys
  • Momentjs:如何将一个时区的日期/时间转换为 UTC 日期/时间

    我有一个带有时区的日期 时间 并且想将其转换为 UTC const date 2019 04 10T20 30 00Z const zone Asia Kuala Lumpur const utcDate moment date tz zo
  • 在 MATLAB 中拆分数组

    我有一个整数数组 我想在 0 出现的地方分割这个数组 并有一个函数给我分割点 示例 数组 0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0 该函数必须返回这些数字 3 10 14 20 2
  • 通过求和来聚合重复行

    根据我的问题 1 识别一组变量是否唯一标识数据的每一行 https stackoverflow com q 22834725 1414455 2 根据给定的变量集标记所有重复的行 https stackoverflow com q 2289
  • CMake 源代码中大小写一致性的工具

    CMake 命令在小写 大写和混合大小写下均有效 然而 将所有这些内容混合在一个文件中会降低 CMake 代码的可读性 有没有一种工具可以自动纠正这种风格不一致的情况 steveire 的答案链接到正确的资源 但让我明确解释一下 以防这些链
  • 关于 sbrk() 和 malloc()

    我已经彻底阅读了有关 sbrk 的 linux 手册 sbrk 改变程序中断的位置 它定义了结束 进程的数据段 即程序中断是第一个 未初始化数据段末尾之后的位置 And I do know that user space memory s
  • 如何刷新 WinForms DataGridView 上的数据源?

    我从 EntityFramework 模型填充 GridView DataSource gwTimeLog DataSource entities TimeLogs 当新行添加到 entities 时 我尝试更新网格 尝试使用与上面相同的语
  • Microsoft Sync Framework 还存在吗?

    根据MS文档Sync Framework Toolkit https code msdn microsoft com Sync Framework Toolkit 4dc10f0e https code msdn microsoft com
  • NSWindowController 与 NSViewController 之间的区别

    我来自iOS背景并开始学习Cocoa 在iOS除非我们有多个目标iPad and iPhone我们通常有一窗并使用管理屏幕UIViewControllers 每个新屏幕大多数时候都会映射到UIViewController 然而 在可可中 这
  • Treeset.contains() 问题

    所以我已经被一个问题困扰了一段时间 我想我不妨在这里寻求帮助 我将 Ticket 对象添加到 TreeSet Ticket 实现 Comparable 并重写 equals hashCode 和 CompareTo 方法 我需要使用 con