我无法从已合并为一个的两个数组中删除重复项。我编写了以下代码来合并数组,但我不知道如何从最终数组中删除重复项。假设数组已经排序。
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;
}
答案 0 :(得分:2)
好的,有人讨厌所有答案。这是另一个尝试,它结合了两个stackoverflow q&#39; s,combining arrays和removing dupes.
这个比我之前尝试的两百万个整数列表运行得更快。
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;
}
控制台输出:
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 :(得分:0)
调用您的合并方法并执行以下操作。我测试了它。它工作正常。
int[] result = merge(count, count1);
Set<Integer> set = new HashSet<Integer>();
try {
for(int i = 0; i < result.length; i++) {
set.add(result[i]);
}
System.out.println(set);
}
catch(Exception e) {}
`
答案 2 :(得分:0)
您可以使用ArrayLists吗? ArrayLists可以很容易地做到这一点。
//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));
}
}
答案 3 :(得分:0)
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]
答案 4 :(得分:0)
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);
}
}
答案 5 :(得分:0)
这是一种仅对数组进行一次迭代且不使用哈希来检测重复项的技术。
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,
}
}
答案 6 :(得分:0)
由于(un)装箱,这种更清晰的lambda解决方案要慢一些
需要Java 8或更高版本
public static int[] mergedistinct( int[] array1, int[] array2 ) {
Stream<Integer> s1 = IntStream.of( array1 ).boxed();
Stream<Integer> s2 = IntStream.of( array2 ).boxed();
return( Stream.concat( s1, s2 ).distinct().mapToInt( i -> i ).toArray() );
}
[1, 2, 3, 5, 4, 7, 8]
如果需要对数组排序:
…
return( Stream.concat( s1, s2 ).distinct().sorted().mapToInt( i -> i ).toArray() );