【问题标题】:How do I search for one array whose contents match another?如何搜索一个内容与另一个匹配的数组?
【发布时间】:2011-10-22 12:07:10
【问题描述】:

当我询问它是否包含指定的坐标时,我有一个 int 数组的 ArrayList 返回 false。它确实包含我请求的坐标,因此它应该返回 TRUE。

这是我的代码。

    //debug code
    for (int i = 0; i < Locations.size(); i++)
    {
        int[] TestLoc = Locations.get(i);

        System.out.print(TestLoc[0] + " " + TestLoc[1] + " " + TestLoc[2] + " == " + Location[0] + " " + Location[1] + " " + Location[2] + "? - ");

        if (Location == TestLoc)
        {
            System.out.println("TRUE");
        }

        else
        {
            System.out.println("FALSE");
        }
    }

    //real code
    if (Locations.contains(Location))
    {
        Locations.remove(Location);
    }

    else
    {
        System.out.println("FAIL");
    }

并输出,当列表包含4个坐标时,请求坐标57、64、105。

56 64 105 == 57 64 105? - 错误

56 64 106 == 57 64 105? - 错误

56 64 107 == 57 64 105? - 错误

57 64 105 == 57 64 105? - 错误

什么给了???

【问题讨论】:

  • 实际上,Location 似乎只是int[] 的变量名:(

标签: java arrays reference contains equality


【解决方案1】:

最好的方法是获取一个数据类,例如 Coordinate 来存储您的数据并覆盖 equals 方法。如果您只存储电话号码,另一种选择可能是使用字符串来表示格式良好的电话号码,并使用 String 类的 equals 方法。

【讨论】:

  • 所有很好的答案,但是我宁愿不为我可能只会使用一次的东西创建一个新类并覆盖方法。 arrays.equals 也不起作用,所以我按照上面的建议将坐标转换为字符串并进行比较。它奏效了。
  • 感谢您接受我的回答。然而,我觉得有义务告诉你,你不应该避免创建类。养成使事物整洁、干净和可扩展的习惯。在这里创建一个类是最好的选择。
【解决方案2】:

问题似乎与以下行有关:

if (Location == TestLoc)

推测TestLoc是一个整数数组,Location也绑定了一个数组。

上面的测试只会在TestLocLocation变量都指向同一个数组实例时返回真,如果这两个变量指向不同的数组则不会返回真instances,它们恰好在相同的位置具有相同的整数。您正在测试上面的“引用相等”——仅询问这两个事物是否相同事物——而不是“值相等”,它询问两个事物是否等价 ,无论它们在计算机内存空间中是否表示为两个不同的对象。

有些编程语言缺乏这种区别,有些允许定义新类型,这些新类型更好地被视为值(身份无关紧要)而不是实体,身份可能比任何可能的值等价更重要。 Java 使用一种独特的方法——Object#equals()——来查询 Object 实例的等价或值相等,而 == 运算符总是只做一件事:它评估任何两件事的值相等,即使这些事情是 对象引用

因此,当您在此处比较两个数组实例时,它们都是某种类型的 Object== 运算符不询问这些引用所指向的两件事是否指向等价,而是引用本身的值是否等价。如果它们碰巧指向同一个目标对象,则它们是等价的,但如果它们不指向,则两个不同的目标对象在值上是否相似并不重要; == 返回 false,因为两个目标对象由不同的引用表示。

【讨论】:

    【解决方案3】:

    Java 中的数组是对象。

    当您使用== 运算符时,您是在比较Location 是否与Testloc 是同一个数组,而事实并非如此。你真正想要的是比较每个数组中的值,看看它们是否相等。

    您可以使用Arrays.equals() 静态方法来比较两者是否相等,而不是自己编写。

    【讨论】:

      【解决方案4】:

      这对我有用:

      List<int[]> l = new ArrayList<int[]>();
          l.add(new int[] {56, 64, 105});
          l.add(new int[] {56, 64, 105});
          l.add(new int[] {56, 64, 105});
          for (int i = 0; i < l.size(); i++)
          {
              int[] t = l.get(i);
      
              if (l.get(i) == t)
              {
                  System.out.println("TRUE");
              }
      
              else
              {
                  System.out.println("FALSE");
              }
          }
      

      【讨论】:

      • 这总是正确的,因为t 总是在引用上等于l.get(i)。所以这不是一个有趣的点。
      【解决方案5】:

      通过使用 == 比较数组,您可以检查它们是否是同一个数组。您必须遍历每个数组并检查 TestLoc[i] == Location[i]。您也许可以使用 .equals(),我不记得 java 是否有用于数组的 .equals()

      【讨论】:

      【解决方案6】:

      Java 的数组 equals 是身份相等。您需要创建一个实际的Coordinate 类。

      换一种说法:

      int[] c1 = new int[] { 1, 2 };
      int[] c2 = new int[] { 1, 2 };
      System.out.println(c1.equals(c2)); // prints false
      

      【讨论】:

      • 在创建Coordinate 类时,不要忘记覆盖equals()hashCode()
      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      相关资源
      最近更新 更多