2013-11-26 48 views
2

我有一个integer列表的整数列表,我想从第一个列表中查看每个数组,并将它与列表列表中的所有前面的数组进行比较。如果数组与之前的数组相同,那么程序应该输出“repeat”并停止程序。另外,是否有任何方法来排序数组,以便程序运行速度更快,效率更高?提前致谢。排序和比较整数数组中的Java列表

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

把你的阵列放在一个小包装中,它实现了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++; 
     } 
    } 
} 
+0

对不起,我是新来的Java,什么是hashCode()?你如何使用它? – user2654764

+1

对于任何数据对象,Hashcode都返回一个*通常*的值。 'HashSet'使用它来查找值,然后执行'equals'来查看它们是否相同。 –

+0

什么是HashSet? – user2654764

1

排序内部数组排序,如快速排序。

你可以通过做Arrays.equals(num1,num3)来比较数组; ,这只有在数组被排序时才有效。

从Java文档

“两个阵列被认为是相等的,如果两个阵列包含相同数量的元件,并且在这两个阵列元件的所有相应对是相等的。换句话说,两个数组相等,如果他们包含在相同的顺序相同的元素“

+0

你确定吗?我认为你需要'Arrays.equals()',Java'[I.equals()'直接从Object继承,换句话说,它比较引用。 –

+0

你是对的。编辑的解决方案。 –