在Java中比较两个整数数组

29

我正尝试编写用于比较两个数组的代码。第一个数组中包含我自己的数字,而第二个数组从输入文件中获取数字。该数组的大小由文件中的第一个数字确定,而第一个数组始终为大小10。两个数组的长度和数字必须相同。

以下是我的代码:

public static void compareArrays(int[] array1, int[] array2) {
    boolean b = false;
    for (int i = 0; i < array2.length; i++) {

        for (int a = 0; a < array1.length; a++) {

            if (array2[i] == array1[a]) {
                b = true;
                System.out.println("true");
            } else {
                b = false;
                System.out.println("False");
                break;
            }
        }
    }       
}

7
你有什么问题? - Rich
2
@Rich,看起来OP根本没有比较数组。只是读取了代码。 - Luiggi Mendoza
3
首先,你需要向我们定义如何确定两个数组在你的练习中是否相等:长度相同并且元素相同但顺序不同,长度不同但元素相同(可以接受重复元素和不同的顺序),两个数组具有相同的长度并且相同位置上的元素也相同。 - Luiggi Mendoza
1
这是一个不错的代码来创建随机布尔值。你说的“两个数字”是什么意思? - Ingo
4
我不确定自己是否正确,但我认为这似乎是一个学习Java和算法的练习。既然OP正在学习阶段,为什么人们要走“简单”的路,说“使用Arrays#someFancyFunctionThatWontHelpYouToLearn”呢?相反,我们应该专注于帮助OP理解问题,并达到他/她自己的答案。把鱼给渔民永远不会帮助他学会钓鱼。 - Luiggi Mendoza
显示剩余11条评论
10个回答

73

根据我所看到的,您只是尝试查看它们是否相等,如果这是true,那么只需使用类似以下的内容:

boolean areEqual = Arrays.equals(arr1, arr2);

这是标准的做法。

请注意,为被视为相等,数组还必须排序,来自JavaDoc的说明:

如果两个数组包含相同数量的元素,并且两个数组中对应的元素对是相等的,则认为这两个数组相等。换句话说,如果两个数组以相同的顺序包含相同的元素,则它们是相等的。

很抱歉错过了那个。


15
Arrays.sort() 方法不会返回已排序的数组。 - Sergey Grinev
15
对数组进行排序是完全错误的。想象一下两个数组 a={ 0, 1 }b={ 1, 0 },它们完全不相等,但是对它们进行排序和比较会得出相等的结果。你正在做的是查找数组中是否存在相同的元素,但这是不同的事情。 - Petr
4
我认为在添加排序之前,这个答案是正确的,并且这就是它获得原始赞成票的原因。 - Paul

35

Arrays.equals(ary1,ary2) 方法用于比较两个一维数组的内容是否相等,返回一个布尔值。

编辑:
如果要比较二维数组,可以使用Arrays.deepEquals(ary1,ary2)

你也可以查看这篇文章,了解 Arrays.equls(ar1,ar2)Arrays.deepEquals(ar1,ar2) 之间的区别。

Java Arrays.equals() 对于二维数组返回 false

编辑 2:
如果不想使用这些库方法,那么你可以轻松地实现自己的方法,像这样:

public static boolean ArrayCompare(int[] a, int[] a2) {
    if (a==a2)   // checks for same array reference
        return true;
    if (a==null || a2==null)  // checks for null arrays
        return false;

    int length = a.length;
    if (a2.length != length)  // arrays should be of equal length
        return false;

    for (int i=0; i<length; i++)  // compare array values
        if (a[i] != a2[i])
            return false;

    return true;
}

在原帖的问题中请阅读我的评论。顺便说一下,它有2个赞。 - Luiggi Mendoza
我不是那个给你们所有人都投了反对票的人,可能是因为你们在照顾 OP,毕竟他/她正在学习阶段,答案应该更多地关于算法而不是正确方法。 - Pshemo
6
我并不是在给他喂口饭,只是让他了解这些库方法——而且我从来没有见过因为像这样的目的(答案并没有错)而被踩的情况——这样做会让提问者和未来的参考者更加困惑。 - exexzian
@user2052514,请查看我的更新答案 - 我已经包括了方法实现以及库方法。 - exexzian

19
public static void compareArrays(int[] array1, int[] array2) {
        boolean b = true;
        if (array1 != null && array2 != null){
          if (array1.length != array2.length)
              b = false;
          else
              for (int i = 0; i < array2.length; i++) {
                  if (array2[i] != array1[i]) {
                      b = false;    
                  }                 
            }
        }else{
          b = false;
        }
        System.out.println(b);
    }

5
在第一次发现两个元素不相等的情况下,最好打印 false 并在循环中断。同样地,如果该方法返回布尔类型,则应返回 false。如果第一个元素就不同,那么遍历1000个元素是毫无意义且资源浪费的。我还会认为基于返回布尔值并根据其打印输出更好。这样,即使要静默地检查相等性,也可以使用该方法。虽然这个答案可能对提问者有帮助,但我认为 exexzian 的回答更完整。 - Reti43

7
如果您知道数组的大小相同,那么排序后再比较会更快。
Arrays.sort(array1)
Arrays.sort(array2)
return Arrays.equals(array1, array2)

如果您不想更改数组中的数据顺序,则可以先使用System.arraycopy


sort() 使用平均 2*n*ln(n) 次比较的 快速排序,而 equals()最坏 情况下只需要 n 次比较。更不用说实际交换元素了。这样做会更慢,而即使是最优秀的基数排序也会更慢。 - Matthew Read
@MatthewRead,它使用TimSort。比较所有元素对的时间复杂度为O(n^2)。这将检查两个数组是否包含相同的元素。您只能在O(n)的时间内检查数组是否以相同的顺序包含相同的元素。这取决于您对相等的概念,但是您的建议和这个答案是不等价的 - Boris the Spider

2

现有的答案都没有涉及使用比较器,因此不能用于二叉树或排序。所以我在这里提供一个解决方案:

public static int compareIntArrays(int[] a, int[] b) {
    if (a == null) {
        return b == null ? 0 : -1;
    }
    if (b == null) {
        return 1;
    }
    int cmp = a.length - b.length;
    if (cmp != 0) {
        return cmp;
    }
    for (int i = 0; i < a.length; i++) {
        cmp = Integer.compare(a[i], b[i]);
        if (cmp != 0) {
            return cmp;
        }
    }
    return 0;
}

int cmp = a.length - b.length; 可以返回任何整数(但不是0),不一定是1或-1。 - c0der
@c0der 说得对。在Java中,当涉及比较器时,任何负整数都可以被返回以表示“小于”,而任何正整数则表示“大于”。它不必是{-1,0,1}中的一个。 - etherous
阅读 https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare(T,%20T) 我看到: "被定义为返回 -1、0 或 1 中的一个"。 - c0der

2

4
我不同意这个被踩的观点。这个回复回答了他的问题,而且他总是可以深入源代码来看它是如何工作的... - tstorms
是的,为什么要踩这个答案呢?它并没有错。即使 OP 正在学习,介绍这些可用的库和方法也没有任何问题。 - exexzian
@sansix,你的第一堂Java编程课是有关处理集合吗?不是的话,那就从基础开始。 - Luiggi Mendoza
1
@LuiggiMendoza 看起来你到目前为止的Java编程就像是在走同样的无聊的过程步骤 :P - 天知道为什么这些库会存在,当像你这样的人可用时 :P - exexzian
@sansix,你不明白“学习阶段”这个词吗?你会把兰博基尼送给一个刚上驾校的人吗? - Luiggi Mendoza
1
@LuiggiMendoza 为什么不呢?如果他的父亲足够富有,能够购买很多-同样,如果有丰富的库可用,为什么不使用它们?如果要学习,他也可以轻松地从这些东西中学习-Java是开源的-代码也很容易获得。 - exexzian

1
即使有像.equals这样简单的方法,我仍想指出你在代码中犯了两个错误。第一个是:当你遍历数组时,你会说btruefalse。然后你再次开始检查,因为有循环。但每次你都给b赋一个值。所以,无论发生什么,b得到的值总是最后一个循环的值。下一次,设置boolean b = trueif equal = true,不做任何事情,if equal = falseb=false
其次,你现在正在检查array1中的每个值与array2中的每个值。如果我理解正确,你只需要检查数组中相同位置的值,这意味着你应该删除第二个循环,并像这样检查:if (array2[i] == array1[i])。然后你的代码应该也能正常工作。
你的代码将按如下方式工作:
public static void compareArrays(int[] array1, int[] array2) {
    boolean b = true;
    for (int i = 0; i < array2.length; i++) {
        if (array2[i] == array1[i]) {
            System.out.println("true");
        } else {
            b = false;
            System.out.println("False");
        }
    } 
    return b;

}

但是正如其他人所说,更简单的方法是:Arrays.equals(ary1,ary2);

PS. 我把别人的答案编辑到我的文本中了,我搞砸了 :( - Joetjah
我尝试了这段代码,对于不匹配的数组它正常工作,但当数组相同时,会打印出true和false。 - user2052514
很抱歉,我完全错过了你的break语句。那实际上是相当正确的!这意味着你的代码只有一个缺陷,就是双重for循环。 - Joetjah
@Joetjah 数组必须按照相同的顺序排列,才能使用Arrays.equals()方法进行比较。因此,您需要执行类似于Arrays.equals(Arrays.sort(arr1), Arrays.sort(arr2))的操作。 - comanitza
没错。我假设在这种情况下,数组是相同的,或者如果他需要检查它们是否以相同的方式排序。 - Joetjah

1

数组的长度必须相同,且数字在整个数组中必须相同(第一个数组中的数字必须相同,以此类推)

基于这个评论,您已经有了算法:

  1. 检查两个数组是否具有相同的长度:

    array1.length == array2.length

  2. 相同位置上的数字必须相同:

    array1[x] == array2[x]

知道了这些,您可以像这样创建代码(这不是Java代码,而是一种算法):

function compareArrays(int[] array1, int[] array2) {

    if (array1 == null) return false
    if (array2 == null) return false

    if array1.length != array2.length then return false

    for i <- 0 to array1.length - 1
        if array1[i] != array2[i] return false

    return true
}

注意:你的函数应该返回一个布尔值,而不是 void,然后在另一个变量中恢复返回值并使用它来打印消息 "true" 或 "false":
public static void main(String[] args) {
    int[] array1;
    int[] array2;
    //initialize the arrays...
    //fill the arrays with items...
    //call the compare function
    boolean arrayEquality = compareArrays(array1, array2);
    if (arrayEquality) {
        System.out.println("arrays are equals");
    } else {
        System.out.println("arrays are not equals");
    }
}

如果您认为这是向OP传授正确知识的最佳答案,那么最好再检查几个条件-请查看我的编辑。 - exexzian
为了创建一个强大的工具方法,请添加对array1array2null检查。 - oliholz

0

这是我的方法,可能对其他人有用。

public static void compareArrays(int[] array1, int[] array2) {
    if (array1.length != array2.length)
    {
           System.out.println("Not Equal");
    }
    else
    {
        int temp = 0;
        for (int i = 0; i < array2.length; i++) {  //Take any one of the array size
            temp^ = array1[i] ^ array2[i];   //with help of xor operator to find two array are equal or not                 
        }
        if( temp == 0 )
        {
             System.out.println("Equal");
        }
        else{
             System.out.println("Not Equal");
        }
    }
}

我无意中编写了一个相同的函数代码,用于比较两个int数组,但是如果array1 = [-1, -2, 3]; array2 = [-1, 2, -1];那么函数的结果将会是true - Gale Yao

-2
为了完整起见,您应该有一个可以检查所有数组的方法:
    public static <E> boolean compareArrays(E[] array1, E[] array2) {
      boolean b = true;
      for (int i = 0; i < array2.length; i++) {
        if (array2[i].equals(array1[i]) ) {// For String Compare
           System.out.println("true");
        } else {
           b = false;
           System.out.println("False");
        }
      } 
      return b;
    }

这真的完全没有回答问题。这个函数不能用于所有数组,特别是对于int数组而言它会失败。 - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接