2017-04-10 4 views
0

Ich überprüft Fragen, die zu meinem Problem vor dem Posten dieser Frage, aber nichts nützliches finden konnte. Ich versuche, den Zusammenführungssortieralgorithmus zu ändern, um doppelte Einträge in einem Array von ganzen Zahlen zu löschen. Leider ist das einzige Ergebnis, das ich erhalten habe, ein geordnetes Array, in dem die doppelten Einträge durch Nullen ersetzt werden. HierMit merge sort, um doppelte Einträge im Array zu entfernen

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

ist die Ausgabe des Codes oben:

Output:

Bin ich einige grundlegende Punkt fehlt? Gibt es eine effektive Möglichkeit, diesen Code zu modifizieren, um ein Array von einzigartigen Elementen ohne diese Null-Wiederholung zu erhalten?

+0

Warum nicht einfach ein neues Array erstellen, in das Sie die 0-Werte nicht schreiben? Behalte einfach einen Zähler, wie viele einzigartige Elemente du erkennst, und dann wirst du auch wissen, wie groß dein neues Array am Ende sein muss. –

+0

Ich dachte auch über so etwas nach, leider ist der Fall nicht ausgeschlossen, in dem eine oder mehrere Nullen Elemente des ursprünglichen Arrays sind, und es wäre unmöglich, die "richtigen" Nullen von den "falschen" zu unterscheiden. –

+0

Aber du solltest sowieso nur eine Null behalten, oder? Was passiert also, wenn Sie nach dem Sortieren Inhalte in ein neues Array kopieren und nur ein if-Element kopieren, bevor es negativ oder border ist, und ein Element, nachdem es positiv oder border ist? Allerdings müssen Sie immer noch im Auge behalten, ob eine Null im ursprünglichen Array war oder nicht, aber das kann auch im ersten Durchgang geschehen. –

Antwort

0

könnten Sie tun

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

Und wenn Sie wollte zurück Array

yourArrayList = new ArrayList<>(uniqueElems); 

Ihre Gleichen unter der Annahme() -Methode für das Element richtig

definiert ist
0

Vor allem mit Array statt von ArrayList oder anderer Collection ist nur ein harter Weg, um diese Art von Code erfolgreich zu machen. hier Sowieso ist, wie dieses Problem zu lösen:

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

Und nun die return-Anweisung wird wie folgt aussehen:

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

distinct() - entfernt alle Duplikate.

mapToInt (i -> i) .toArray() - macht ArrayList nur noch ein Array.