2015-11-03 17 views
0

给定2个数组,如何快速找出它们是否相同的值?Java - 如何查找2个数组是否相互重复?

例如,ARR1和ARR2被认为是相同的,因为它们含有相同的值,而ARR2和ARR3不

int[] arr1 = new int[]{-1, 0, 1}; 
int[] arr2 = new int[] {-1, 0, 1}; 
int[] arr3 = new int[] {0, -1, 1}; // not identical 

什么是找出最快的方法是什么?我知道一个for循环会起作用,但是你能更快速地说,时间不变吗? HashSet不起作用,因为技术上arr1和arr2是不同的对象

Edit1:如果有N个数组,我们想要过滤出唯一的数组?

+6

'阵列.equals'? –

+1

只要注意,无论你使用什么方法 - 它仍然会在内部涉及一个循环,因此不会是恒定的时间。 – RealSkeptic

+0

这实际上并不是恒定的时间。你至少必须读取两个数组的所有元素,至少是O(n)。 –

回答

5

Arrays.equals将检查两个数组的基于内容的平等;它是O(n),这是最佳的。你不能比O(n)做得更好。

如果要过滤n个阵列中的独特阵列,你可能会写这样的事情:

import java.nio.IntBuffer; 
int[][] distinctArrays(int[]... arrays) { 
    Set<IntBuffer> set = new HashSet<>(); 
    for (int[] array : arrays) { 
    set.add(IntBuffer.wrap(array)); 
    } 
    int[][] result = new int[set.size()][]; 
    int i = 0; 
    for (IntBuffer wrappedArray : set) { 
    result[i++] = wrappedArray.array(); 
    } 
    return result; 
} 

...或者,与Java 8 ...

int[][] distinctArrays(int[]... arrays) { 
    return Stream.of(arrays) 
    .map(IntBuffer::wrap) 
    .distinct() 
    .map(IntBuffer::array) 
    .toArray(int[][]::new); 
} 
相关问题