合并两个数组并删除Java中的重复项

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
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) {}

`