【问题标题】:Sorting and Comparing Arraylist of Integer Arrays in Java [closed]在 Java 中排序和比较整数数组的 Arraylist [关闭]
【发布时间】:2013-12-12 08:07:23
【问题描述】:

我有一个整数数组的数组列表,我想从第一个数组开始遍历每个数组,并将其与数组列表中的所有先前数组进行比较。如果数组等于任何先前的数组,则程序应输出“重复”并停止程序。另外,有没有办法对数组进行排序,以便程序运行得更快、更高效?提前致谢。

例子

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 后停止,因为它们是相同的。

【问题讨论】:

    标签: java arrays performance sorting arraylist


    【解决方案1】:

    将您的数组放在实现hashCode()equals() 的小包装器中。然后使用add() 方法将它们放入HashSet 中。如果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++;
            }
        }
    }
    

    【讨论】:

    • 对不起,我是 Java 新手,什么是 hashCode()?以及如何使用它?
    • Hashcode 返回一个通常对于任何数据对象都不同的值。 HashSet 使用它来查找值,然后执行 equals 以查看它们是否相同。
    • 好的,所以Set 是一组没有重复的对象。这是一个Collection,就像ListHashSet 是一个实现,它使用对象的hashCode()equals() 方法来实现一个集合。还有SortedSet 使用compareTo() 方法或特殊的Comparator 对元素进行排序。 TreeSet 是默认实现。这一切都可以使用搜索引擎轻松找到。
    【解决方案2】:

    使用快速排序等排序方法对内部数组进行排序。

    你可以通过 Arrays.equals(num1,num3); 来比较数组。 ,仅当数组已排序时才有效。

    来自 Java 文档

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

    【讨论】:

    • 你确定吗?我认为你需要Arrays.equals(),Java[I.equals()直接继承自Object,换句话说,它比较引用。
    • 你是对的。编辑解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2011-06-15
    • 1970-01-01
    • 2015-01-19
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多