Java 如何搜索内容与另一数组匹配的数组?

Java 如何搜索内容与另一数组匹配的数组?,java,arrays,reference,contains,equality,Java,Arrays,Reference,Contains,Equality,我有一个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] + "

我有一个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");
    }
//调试代码
对于(int i=0;i
和输出,当列表包含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?-错误


什么给出了???

Java的数组相等是标识相等。您需要创建一个实际的
坐标

换句话说:

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

通过将数组与==进行比较,可以检查它们是否是相同的数组。您必须遍历每个数组并检查TestLoc[i]==Location[i]。您可能可以使用.equals(),我不记得java是否为数组使用了.equals()

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

这对我很有用:

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");
        }
    }
listl=newarraylist();
l、 添加(新int[]{56,64,105});
l、 添加(新int[]{56,64,105});
l、 添加(新int[]{56,64,105});
对于(int i=0;i
以下行似乎有问题:

if (Location == TestLoc)
大概,
TestLoc
是一个整数数组,
Location
也绑定到一个数组

如果
TestLoc
Location
变量都指向同一个数组实例,则上述测试将仅返回true;如果这两个变量指向不同的数组实例,且恰好在相同位置具有相同的整数,则不会返回true。你在测试上面的“引用相等”,只询问这两个东西是否是相同的东西,而不是“值相等”,后者询问两个东西是否相等,而不管它们在计算机内存空间中是否表示为两个不同的对象

有些编程语言没有这样的区别,有些语言允许定义新类型,这些类型被更好地视为值,其中标识不重要,而不是实体,其中标识可能比任何可能的值等价更重要。Java使用一种独特的方法--
Object#equals()
-来查询
Object
实例的等价性或值相等性,而
=
操作符总是只做一件事:它计算任意两个对象的值相等性,即使它们是对象引用


因此,在这里比较两个数组实例时,
==
运算符询问的不是这些引用所指向的两个对象是否等效,而是引用本身的值是否等效。如果它们恰好指向同一个目标对象,那么它们是等价的,但是如果它们没有,那么两个不同的目标对象在值上是否相似并不重要
=
返回false,因为两个目标对象由不同的引用表示。

Java中的数组是对象

当您使用
=
操作符时,您正在比较
Location
是否与
Testloc
是相同的数组,而不是相同的数组。您真正想要的是比较每个数组中的值,看看它们是否相等


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

实际上,
Location
似乎只是
int[]
的变量名:(创建
Coordinate
类时,不要忘了重写
equals()
hashCode())
。由于
Java
中的
数组
是一个
对象,它有。
equals()
是的,但是这个
equals()
将不会像您所希望的那样运行。因此
数组#equals()
方法家族:这将始终是真的,因为
t
总是在引用上等于
l.get(i)
。所以这不是一个有趣的问题。所有的答案都很好,但是我不想为我可能只会使用一次的东西创建一个新类和重写方法。而且array.equals也不起作用,所以我将坐标转换为上面建议的字符串并进行比较。它起了作用。谢谢你接受我的答案。不过,我还是不同意eel不得不告诉你,你不应该避免创建类。养成习惯,让事情变得整洁、干净和可扩展。在这里创建类是最好的选择。