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

时间:2017-02-04 20:31:35

标签: java arrays merge duplicates

我无法从已合并为一个的两个数组中删除重复项。我编写了以下代码来合并数组,但我不知道如何从最终数组中删除重复项。假设数组已经排序。

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;
}

7 个答案:

答案 0 :(得分:2)

好的,有人讨厌所有答案。这是另一个尝试,它结合了两个stackoverflow q&#39; s,combining arraysremoving 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() );