在Java中对整数数组的Arraylist进行排序和比较

时间:2013-11-26 22:49:57

标签: java arrays performance sorting arraylist

我有一个整数数组的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进行比较后停止,因为它们是相同的。

2 个答案:

答案 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

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