一種方式做到這一點,是爲使用的Set
的removeAll()
或retainAll()
方法。另一種方法是並行迭代陣列,不使用Set
。
易於使用的,前兩種方法會使用這個幫手:
private static Set<Integer> asSet(int[] array) {
Set<Integer> set = new HashSet<>();
for (int i : array)
set.add(i);
return set;
}
使用removeAll()
實現:
public static int countDifference(int[] array1, int[] array2) {
// Find distinct elements in array1 that doesn't exist in array2
Set<Integer> distinct1 = asSet(array1);
distinct1.removeAll(asSet(array2));
// Find distinct elements in array2 that doesn't exist in array1
Set<Integer> distinct2 = asSet(array2);
distinct2.removeAll(asSet(array1));
return distinct1.size() + distinct2.size();
}
如果本身保證了陣列不包含重複,然後retainAll()
能找到常見值:
public static int countDifference(int[] array1, int[] array2) {
Set<Integer> common = asSet(array1);
common.retainAll(asSet(array2));
return array1.length + array2.length - 2 * common.size();
}
上述兩種實現都不依賴於正在排序的數組。爲了消除創建集的開銷和所有值的拳擊,你可以使用數組的排序,並且並行迭代他們:
public static int countDifference(int[] array1, int[] array2) {
int idx1 = 0, idx2 = 0, count = 0, val;
while (idx1 < array1.length || idx2 < array2.length) {
if (idx1 == array1.length) {
val = array2[idx2];
count++;
} else if (idx2 == array2.length) {
val = array1[idx1];
count++;
} else {
val = Math.min(array1[idx1], array2[idx2]);
if (array1[idx1] != val || array2[idx2] != val)
count++;
}
while (idx1 < array1.length && array1[idx1] == val)
idx1++; // skipping 0 to many instances of val in array1
while (idx2 < array2.length && array2[idx2] == val)
idx2++; // skipping 0 to many instances of val in array2
}
return count;
}
這將是最快,最內存高效的實現。
思想
這可以說是countDifference
會考慮投入3,5,5,7
和3,5,7
有1個差異。如果是這樣,那麼任何使用Set
是錯誤的,最後的方法應該if
語句替換內while
循環,或者使用更簡單的實現是這樣的:
public static int countDifference(int[] array1, int[] array2) {
int idx1 = 0, idx2 = 0, count = 0;
while (idx1 < array1.length && idx2 < array2.length) {
int cmp = Integer.compare(array1[idx1], array2[idx2]);
if (cmp != 0)
count++;
if (cmp <= 0)
idx1++;
if (cmp >= 0)
idx2++;
}
return count + (array1.length - idx1) + (array2.length - idx2);
}
就個人而言,我認爲這是正確的解決方案,但這取決於應該如何處理數組中的重複值。如果不存在重複,或者重複被認爲是不同的,則這是最好的實施方式,例如,就像上面這個例子中的值5
一樣。
您可以按照與'distinctNumberOfItems'方法相同的方式執行此操作。只需添加第二個循環,您可以再次從該集合中刪除元素。 – SpiderPig
我該如何開始這樣做?我在哪裏放置我的循環? – EstelleVeneer
[查找兩個數組之間的非重複項與Java]可能的重複(http://stackoverflow.com/questions/19401618/find-non-duplicate-items-between-two-arrays-with-java) –