使用合并排序删除数组中的重复条目

时间:2017-04-10 14:04:12

标签: java arrays mergesort repeat

在发布此问题之前,我检查了与我的问题相关的问题,但找不到任何有用的内容。我正在尝试修改合并排序算法以删除整数数组中的重复条目。不幸的是,我获得的唯一结果是一个有序数组,其中重复的条目被零替换。

public static int[] mergeSort(int[] array, int left, int right){
     int[] sortedArray = null;
     if(left == right){
         sortedArray = new int[1];
         sortedArray[0] = array[left];
         return sortedArray;
         }

     int mid = (left+right)/2;
     int[] subA = mergeSort(array, left, mid);
     int[] subB = mergeSort(array, mid+1, right);
     sortedArray = merge(subA, subB);
     return sortedArray;
 }

 private static int[] merge(int[] subA, int[]subB){
     int[] mergedArray = new int[subA.length+subB.length];
     int i, j, k;
     i = 0;
     j = 0;
     k = 0;

     while(i < subA.length && j < subB.length){
         if(subA[i] < subB[j]){
             mergedArray[k] = subA[i];
             i++;
         }
         else if(subA[i] > subB[j]){
             mergedArray[k] = subB[j];
             j++;
         }
         //if the two elements are equal
         else{
             mergedArray[k] = subA[i];
             i++;
             j++;
         }
         k++;
     }

     if(j >= subB.length){
         while(i < subA.length){
             mergedArray[k] = subA[i];
             i++;
             k++;
         }
     }
     else{
         while(j < subB.length){
             mergedArray[k] = subB[j];
             j++;
             k++;
         }
     }

     return mergedArray;
 }

以下是上述代码的输出:

Output:

我错过了一些基本观点吗?是否有任何有效的方法来修改此代码以获得一个独特元素的数组而没有这种零重复?

2 个答案:

答案 0 :(得分:0)

你可以做到

HashSet<T> uniqueElems = new HashSet<>(yourArrayList);

如果你想回到阵列

yourArrayList = new ArrayList<>(uniqueElems);

假设正确定义了元素的equals()方法

答案 1 :(得分:0)

首先使用数组而不是ArrayList或其他Collection只是使这种代码成功的一种难的方法。 无论如何,这里是如何解决这个问题:

ArrayList<Integer> list = new ArrayList<>();
for (int i : mergedArray)
       list.add(i);

现在返回语句将如下所示:

return list.stream().distinct().mapToInt(i -> i).toArray();

distinct() - 删除所有重复项。

mapToInt(i - &gt; i).toArray() - 使ArrayList再次成为一个数组。