【问题标题】:Comparing int value in java?比较java中的int值?
【发布时间】:2014-02-06 08:29:04
【问题描述】:

当我比较folderInfoData.getFolderInfoRecord().getInfoCode()map.get("infoCode") 下面的代码时遇到问题。两者都给出value=2 但我的问题是它没有进入if 条件。

这是一个例子:

if (folderInfoData.getFolderInfoRecord().getInfoCode().equals(map.get("infoCode"))) {
         showNotification(pageResourceBundle.getText("MSG_SAME_INFO_ALREADY_EXISTS"));
          return;
    }

在我用谷歌搜索之前它对我无效:Comparing Integer objects vs int

谁能告诉我如何解决这个问题?

谢谢

【问题讨论】:

  • getInfoCode()的返回类型是什么
  • @Sitansu Integerint?事实证明,这可以产生影响。
  • folderInfoData.getFolderInfoRecord().getInfoCode() 返回什么类型,确切,以及如何,确切声明 map
  • 地图 地图
  • 那将是你的问题,就在那里。

标签: java object map integer int


【解决方案1】:

在 cmets 中,您声明 map 被声明为 Map<String, Object>。这可能就是问题所在。

当您致电map.get("infoCode") 时,您将得到一个Object

如果:

  • Object 实际上是Integer 的一个实例
  • folderInfoData.getFolderInfoRecord().getInfoCode() 正在返回一个 Integer
  • 两个Integers 包含相同的值

然后这个:

if (folderInfoData.getFolderInfoRecord().getInfoCode()
        .equals(map.get("infoCode"))) {

评估结果为true

所以要么它们是两个Integers,但不包含相同的值,要么它们是不同类型的对象并且相等。 (或者,地图中不存在“infoCode”,它正在返回null

【讨论】:

    【解决方案2】:

    如果你想使用.equals(),最好的方法是确保它总是返回Integer而不是int

    int num1 = Integer.parseInt(folderInfoData.getFolderInfoRecord().getInfoCode());
    int num2 = Integer.parseInt(map.get("infoCode"));
    
    if (new Integer(num1).equals(new Integer(num2))) {
         showNotification(pageResourceBundle.getText("MSG_SAME_INFO_ALREADY_EXISTS"));
          return;
    }
    

    【讨论】:

    • Integer num2 = new Integer(map.get("infoCode"));构造函数Integer(Object)未定义
    • @Sitansu 如果你得到 构造函数 Integer(Object) 是未定义的 这意味着 map.get("infoCode") 值已经是 Integer 类型
    • @DnR 不,这意味着他的Map 被声明为Map<String, Object>(参见cmets)。没有构造函数(或 parseInt()) for Integer 接受 Object
    • @BrianRoach 是的,这就是他得到错误的原因,因为Integer 构造函数只允许intstring
    • @DnR 对...但是...阅读您的评论,这不是您所说的:-D 如果它已经是 Integer 类型,它将取消装箱到 int 并工作.
    【解决方案3】:

    您必须检查 两者是否都是具有正确值的 Integer 实例,即通过相等性测试。当两个整数值相同时,测试肯定会通过。请调试您的代码并找出答案。改成==也没用。

    【讨论】:

    • 为什么 .equals 不起作用而 == 不起作用?您应该解释一下,因为 .equals 的默认实现会进行引用(==)比较。您是否打算说 getInfoCode() 返回的对象中的 .equals() 覆盖实现是错误的?
    • 如果它正在编译,这是不正确的。 Map 不能返回一个基元,所以除了引起一些不必要的拆箱外,它不会有任何区别。
    • 因为这些是 int 值,所以应该使用相等运算符。既然它们是双方传递的实际值。为什么我们不应该这样做?
    • 哦,我很抱歉。我确实假设并错误地回答了它。谢谢
    【解决方案4】:

    如果返回字符串

    if (Integer.parseInt(folderInfoData.getFolderInfoRecord().getInfoCode()) == Integer.parseInt(map.get("infoCode"))) {
             showNotification(pageResourceBundle.getText("MSG_SAME_INFO_ALREADY_EXISTS"));
              return;
        }
    

    否则

    if (folderInfoData.getFolderInfoRecord().getInfoCode() == map.get("infoCode")) {
             showNotification(pageResourceBundle.getText("MSG_SAME_INFO_ALREADY_EXISTS"));
              return;
        }
    

    试试这个也是

     if (folderInfoData.getFolderInfoRecord().getInfoCode().toString.trim().equals(map.get("infoCode").toString().trim())) {
             showNotification(pageResourceBundle.getText("MSG_SAME_INFO_ALREADY_EXISTS"));
              return;
        }
    

    【讨论】:

    • Integer类型的parseInt(String)方法不适用于参数(Object)
    【解决方案5】:

    您似乎正在将 int 与 Integer 进行比较。 Java 会自动将 Integer 转换为 int

    所以

    int a = 2;
    Integer b = a;
    System.out.println(a == b);
    

    变成

    int a = 2;
    Integer b = new Integer(a);
    System.out.println(a == b.valueOf());
    

    因此,如果您想使用 equals,请参阅 Rafa El 答案。否则你可以使用==

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多