2017-04-10 12 views
0

この質問を投稿する前に自分の問題に関連する質問をチェックしましたが、役に立たないものは見つかりませんでした。私は整数の配列内の重複したエントリを削除するためのマージソートアルゴリズムを変更しようとしています。残念ながら、私が得た唯一の結果は、重複したエントリーがゼロに置き換えられた順序付き配列です。ここでマージソートを使用してアレイ内の重複したエントリを削除する

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:

は、私はいくつかの基本的なポイント足りませんか?このゼロ繰り返しを使わないでユニークな要素の配列を取得するために、このコードを変更する有効な方法はありますか?

+0

0値を書き込まない新しい配列を作成するだけではどうですか?あなたが検出したいくつかのユニークな要素のカウンタを保持し、新しいアレイがどのくらいの大きさで終わらなければならないかを知ることもできます。 –

+0

私はこのようなことについても考えましたが、残念ながら、1つ以上のゼロが最初の配列の要素である場合を除外することはなく、「正しい」ゼロと「間違った」ゼロを区別することは不可能です。 –

+0

しかし、とにかく1つのゼロを保持する必要があります、右か?では、ソート後にコンテンツを新しい配列にコピーし、要素が負または境界になる前に要素をコピーし、要素が正または境界になった後にのみ要素をコピーしますか?それでもゼロが元の配列かどうかを追跡する必要がありますが、これも最初のパスで行うことができます。 –

答えて

0

あなたは

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

を行うことができそして、あなたは(あなたの等号を想定したアレイに戻し

yourArrayList = new ArrayList<>(uniqueElems); 

を望んでいたならば)要素のための方法ではなく、すべての使用して、配列の正確

0

最初に定義されていますそのようなコードを成功させるのは困難です。

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

そして今、return文は次のようになります:とにかくここ は、この問題を解決する方法です)(

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

明確な - すべての重複を削除します。

mapToInt(i - > i).toArray() - ArrayListを再び配列にします。

関連する問題