我有一个整数数组的arraylist,我想从第一个数组中查看每个数组,然后将它与arraylist中的所有先前数组进行比较。如果数组等于任何先前的数组,则程序应输出“repeat”并停止程序。此外,有没有办法对数组进行排序,以便程序运行得更快,更有效?提前谢谢。
实施例
Arraylist<int[]> numbers = new Arraylist<int[]>();
int[] num1 = new int[]{1,2,3};
int[] num2 = new int[]{2,3,5};
int[] num3 = new int[]{1,2,3};
int[] num4 = new int[]{3,2,6};
numbers.add(num1);
numbers.add(num2);
numbers.add(num3);
numbers.add(num4);
(Sorting to make more efficient and faster)
(Comparing)
程序应打印出“重复”并在将num3与num1进行比较后停止,因为它们是相同的。
答案 0 :(得分:2)
将您的数组放在一个实现hashCode()
和equals()
的小包装器中。然后使用HashSet
方法将它们放入add()
。如果add
方法返回false
,则表示您有重复。
您可以使用Arrays.hashCode
作为hashCode()
和Arrays.equals(array1, array2)
的返回值来实施equals()
。
唯一的事情是,要在之后创建列表,您需要从Set
中检索对象,获取字节数组并将其放入列表中。您可以使用List.addAll()
将包装器对象放入列表中。但也许你想要保持Set
,取决于进一步的使用。
好的,也许这有点高级,我为你做了一个实现:
public class Dupes {
public static class WrappedArray {
public WrappedArray(int[] wrapped) {
this.wrapped = wrapped;
}
public int[] getWrapped() {
return this.wrapped;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof WrappedArray)) {
return false;
}
WrappedArray that = (WrappedArray) obj;
return Arrays.equals(this.wrapped, that.wrapped);
}
@Override
public int hashCode() {
return Arrays.hashCode(wrapped);
}
private final int[] wrapped;
}
public static void main(String[] args) {
List<int[]> numbers = new ArrayList<int[]>();
int[] num1 = new int[] { 1, 2, 3 };
int[] num2 = new int[] { 2, 3, 5 };
int[] num3 = new int[] { 1, 2, 3 };
int[] num4 = new int[] { 3, 2, 6 };
numbers.add(num1);
numbers.add(num2);
numbers.add(num3);
numbers.add(num4);
Set<WrappedArray> wrappedNumberSet = new HashSet<>();
int index = 1;
for (int[] number : numbers) {
if (!wrappedNumberSet.add(new WrappedArray(number))) {
System.out.println("Duplicate num" + index);
}
index++;
}
}
}
答案 1 :(得分:1)
使用诸如快速排序之类的排序对内部数组进行排序。
您可以通过执行Arrays.equals(num1,num3)来比较数组; ,仅在数组排序时才有效。
来自Java doc
“如果两个数组包含相同数量的元素,并且两个数组中所有相应的元素对相等,则认为两个数组相等。换句话说,如果它们包含相同顺序的相同元素,则两个数组相等“