有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java相同的数组元素

我想检查一个数组中的所有元素是否与另一个数组中的所有元素相同,即一对一匹配。(注意:两个数组元素的顺序不同)

有没有一种快速的方法,或者一个我可以使用的现成的库

目前,我能想到的两种方式并不漂亮:

逐个匹配(编辑3:这个例子是错误的,不适合重复)

    boolean exactMatch = true;
    if(strList1.size() == strList2.size()){
        for(String str: StrList1){
            if(!strList2.contains(str)){
                exactMatch = false;
                break;
            }
        }
    }

排序然后匹配(更优化,尤其是针对大型阵列)

    strList1 = Arrays.sort(strList1);
    strList2 = Arrays.sort(strList2);

    boolean exactMatch = true;
    if(strList1.size() == strList2.size()){
        for (int i = 0; i < strList1.length; i++) {
            if(!strList1[i].equals(strList2[i])){
                exactMatch = false;
                break;
            }
        }
    }

编辑1

谢谢大家的评论。数组元素的顺序不同。即,以下内容将返回false:

String[] strList1 = {"ABC", "CDE", "EFG"};
String[] strList2 = {"ABC", "EFG", "CDE"};
System.out.println("array equals " + Arrays.deepEquals(strList1, strList2));

编辑2

“myusuf”指出的一个优点是数组中的重复项。 这意味着我的“逐个匹配”示例将不起作用。举个例子:

public static void main(String[] args) {
    String[] strList1 = {"ABC", "CDE", "EFG", "ABC"};
    String[] strList2 = {"ABC", "EFG", "CDE", "CDE"};
    System.out.println(arrayEquals(strList1,strList2));
}
private static boolean arrayEquals(String[] array1, String[] array2) {
    List<String> list1 = Arrays.asList(array1);
    List<String> list2 = Arrays.asList(array2);
    return list1.containsAll(list2) && list2.containsAll(list1);
}

在本例中,strList1的“ABC”有一个副本,strList2的“CDE”有一个副本,但它们仍然匹配,因为它们的唯一元素仍然相同,而数组本身不同


编辑3

谢谢所有回答的人。 因此,经过多次往返之后,似乎最短的方法是:

    String[] strList1 = {"ABC", "CDE", "EFG", "CDE", "EFG"};
    String[] strList2 = {"ABC", "EFG", "CDE", "EFG", "CDE"};

    Arrays.sort(strList1);
    Arrays.sort(strList2);
    boolean exactMatch = Arrays.deepEquals(strList1, strList2);

    System.out.println("test3 - match: " + exactMatch);

我希望有一个方法调用可以完成所有的工作,但似乎已经完成了。 数组。deepEquals()仅适用于排序数组,前提是所有元素的顺序都不同。 使用contains()的方法不起作用,因为存在重复项


共 (2) 个答案

  1. # 1 楼答案

    Arrays#deepEquals(java.lang.Object[], java.lang.Object[])
    

    它提供了两个数组引用是否完全相等的信息

    Arrays.deepEquals(e1,e2);
    

    Two possibly null elements e1 and e2 are deeply equal if any of the following conditions hold:

     - e1 and e2 are both arrays of object reference types, and
       Arrays.deepEquals(e1, e2) would return true
     - e1 and e2 are arrays of the same primitive type, and the appropriate
       overloading of Arrays.equals(e1, e2) would return true.
     - e1 == e2
     - e1.equals(e2) would return true.
    
    Note that this definition permits null elements at any depth.
    

    Documentation

    Arrays#equals(Object[],Object[])方法不同,此方法适用于任意深度的嵌套数组

  2. # 2 楼答案

    可以使用listremoveAll方法

    strList2.removeAll(strList1)
    
    if(strList2.isEmpty)
    {
      // Exact match
    }
    else{
    
      // failed
    }