gpt4 book ai didi

java - 相同的数组元素

转载 作者:行者123 更新时间:2023-11-29 06:35:05 25 4
gpt4 key购买 nike

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

是否有快速的方法或我可以使用的现有库?

目前我能想到的两种方式都不太好看:

一个一个匹配 (编辑 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);

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

最佳答案

这将是您问题的简短解决方案。我相信有更多高效但复杂的方法可以做到这一点。这里 arrayEquals 将您的数组转换为 List 并使用 List.containsAll 检查相等性。

public class ArrayEquality {
public static void main(String[] args) {
String[] array1 = {"test1","test2"};
String[] array2 = {"test2","test1"};
String[] array3 = {"test2","test3"};

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

System.out.println(arrayEquals(array1,array2));
System.out.println(arrayEquals(array2,array3));

System.out.println(arrayEquals(strList1,strList2));
}

//ARRAY EQUALITY CHECK
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);
}
}

要处理此解决方案中的重复项,可以像这样更改 arrayEquals

private static boolean arrayEquals(String[] array1, String[] array2) {
List<String> list1 = Arrays.asList(array1);
List<String> list2 = Arrays.asList(array2);

Collections.sort (list1);
Collections.sort (list2);
return list1.equals(list2);
}

可以通过大小检查来优化它以避免排序。

关于java - 相同的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22496899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com