Merge two arrays and remove duplicates in Java
我在从合并为一个数组的两个数组中删除重复项时遇到问题。我已经编写了以下合并数组的代码,但是我不知道如何从最终数组中删除重复的。假设数组已经排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public static int[] merge(int[] list1, int[] list2) { int[] result = new int[list1.length + list2.length]; int i = 0; int j = 0; for (int k = 0; k < (list1.length + list2.length); k++) { if (i >= list1.length) { result[k] = list2[j]; j++; } else if (j >= list2.length) { result[k] = list1[i]; i++; } else { if (list1[i] < list2[j]) { result[k] = list1[i]; i++; } else { result[k] = list2[j]; j++; } } } return result; } |
好吧,有人讨厌所有的答案。下面是组合两个stackoverflow q的另一个尝试,组合数组并删除重复项。
这个比我之前尝试的两个一百万整数的列表快得多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public int[] mergeArrays2(int[] arr1, int[] arr2){ int[] merged = new int[arr1.length + arr2.length]; System.arraycopy(arr1, 0, merged, 0, arr1.length); System.arraycopy(arr2, 0, merged, arr1.length, arr2.length); Set<Integer> nodupes = new HashSet<Integer>(); for(int i=0;i<merged.length;i++){ nodupes.add(merged[i]); } int[] nodupesarray = new int[nodupes.size()]; int i = 0; Iterator<Integer> it = nodupes.iterator(); while(it.hasNext()){ nodupesarray[i] = it.next(); i++; } return nodupesarray; } |
号
控制台输出:
1 2 3 4 5 | INFO [main] (TestMergeArray.java:40) - creating two lists of a million ints DEBUG [main] (TestMergeArray.java:41) - list 1 size : 1000000 DEBUG [main] (TestMergeArray.java:42) - list 2 size : 1000000 INFO [main] (TestMergeArray.java:56) - now merging INFO [main] (TestMergeArray.java:59) - done, final list size is 864975 |
这是一种迭代数组一次的技术,不使用哈希来检测重复项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import java.util.List; import java.util.ArrayList; import java.util.Arrays; public class SortedMerge { public static int[] merge(int[] array1, int[] array2) { int[] a; int[] b; List<Integer> c = new ArrayList<Integer>(); int i = 0; int j = 0; // b is longer than a if (array1.length > array2.length) { a = array2; b = array1; } else { a = array1; b = array2; } while (j < b.length) { int bb = b[j]; if (i < a.length) { int aa = a[i]; if (aa > bb) { c.add(bb); j++; } else { c.add(aa); i++; if (aa == bb) { j++; } } } else { c.add(bb); j++; } } // java 8 List<Integer> to int[] return c.stream().mapToInt(Integer::intValue).toArray(); } public static void main(String[] args) throws Exception { int[] array1 = new int[] { 3, 5, 8, 11, 14 }; int[] array2 = new int[] { 1, 2, 3, 4, 6, 8, 14, 15, 17 }; int[] c = merge(array1, array2); for (int i = 0; i < c.length; i++) { System.out.format("%d,", c[i]); } System.out.println(); // output> 1,2,3,4,5,6,8,11,14,15,17, } } |
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import java.util.ArrayList; import java.util.List; public class MergeListAndRemoveDuplicate { public static void main(String[] args) { int a[] = { 1, 1, 2, 1, 3, 4, 1, 2, 5 }; int b[] = { 1, 2, 3, 1, 3, 2, 4, 5, 6, 7 }; boolean flag = true; List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < a.length; i++) { for (int j = 0; j < b.length; j++) { if (a[i] == b[j]) { flag = false; } if (i == j && !list.contains(b[j])) { list.add(b[j]); } } if (flag == true) { list.add(a[i]); } } System.out.println(list); } |
。
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package com.string.merge; import java.util.ArrayList; public class MergeArrayAndRemoveDuplicate { public static void main(String[] args) { int[] a = { 1, 2, 2, 3, 1, 5, 3 }; int[] b = { 4, 3, 1, 5, 7, 8, 4, 2 }; ArrayList<Integer> l = new ArrayList<>(); for (int i = 0; i < (a.length > b.length ? a.length : b.length); i++) { if (i < a.length) { int c = 0; while (c <= l.size()) { if (l.contains(a[i]) == false) { l.add(a[i]); } c++; } } if (i < b.length) { int c = 0; while (c <= l.size()) { if (l.contains(b[i]) == false) { l.add(b[i]); } c++; } } } System.out.println(l); } } o/p-[1, 4, 2, 3, 5, 7, 8] |
你能用数组列表吗?数组列表会使这很容易做到。
1 2 3 4 5 6 7 8 9 10 | //Consider n1 to be some global or instance variable. import java.util.ArrayList; public void Add(ArrayList<Integer> n2) { for(int i = 0; i < n2.size(); i++) { if(!n1.contains(i)) n1.add(n2.get(i)); } } |
。
调用合并方法并执行以下操作。我测试过了。它工作得很好。
1 2 3 4 5 6 7 8 9 10 |
`