2015-11-03 49 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); 
} 
相關問題