Java - 如何查找2个数组是否相互重复?

时间:2015-11-03 21:40:54

标签: 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个阵列,我们想过滤掉那些独特的阵列怎么办?

2 个答案:

答案 0 :(得分: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);
 }

答案 1 :(得分:0)

equals课程中有Arrays方法,这里是JavaDoc:Arrays.equals