Aus einem Array doppelte Zahlen löschen ohne Hilfsmethoden?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das ganze Array braucht man nicht jedes Mal durchsuchen, es reicht, die Elemente rechts vom aktuellen Element zu überprüfen, oder?


leKAzz203 
Fragesteller
 18.04.2022, 17:47

Ich weiß leider nicht, was du genau meinst... Kannst du es mir bitte mit paar Beispielen erklären?

0
PhotonX  18.04.2022, 17:51
@leKAzz203

Na ja, bei dem Beispiel aus deiner Frage

{1, 3, 3, 1, 2, 1, 5}

würde ich erst das erste Element festhalten, das ist eine 1, und alle Elemente rechts davon (also {3, 3, 1, 2, 1, 5}) auf Einser überprüfen und die rauslöschen. Dadurch bleibt mir das Array

{1, 3, 3, 2, 5}

übrig. Dann halte ich das zweite Element des neuen Arrays fest, das ist eine 3, und überprüfe alle Elemente rechts davon (also {3, 2, 5}) auf Dreier und lösche sie raus. Dadurch bleibt noch das Array

{1, 3, 2, 5}

übrig. Also halte ich das dritte Element des neuen Arrays fest, das ist eine 2, und überprüfe alle Elemente rechts davon (also {5}) auf Zweier und lösche sie raus. Das Array bleibt in dem Fall unverändert.

Schließlich halte ich das vierte Element des neuen Arrays fest, das ist eine 5, sie hat aber keine Elemente rechts von sich, also sind wir fertig.

0
TechPech1984  18.04.2022, 17:55
@PhotonX

viel zu umständlich mit dem löschen , eigentlich genau anders rum

siehe gfntom antwort

2
leKAzz203 
Fragesteller
 18.04.2022, 18:04
@PhotonX
public static void main(String[] args) {
    System.out.println(Arrays.toString(deleteEquals(new int[]{1, 3, 3, 1, 2, 1, 5})));

}

public static int[] deleteEquals(int[] ia) {
    int[] erg = new int[ia.length];
    for (int i = 0; i < ia.length -1; i++) {
        if (ia[i] != ia [i+1] ) {
            erg [i] = ia [i];
        }
    }
    return erg;
}
0
PhotonX  18.04.2022, 18:06
@leKAzz203

Das haut so nicht hin, du bräuchtest hier zwei for-Schleifen, einmal fürs festgehaltene Element und einmal beim Durchgehen und Rauslöschen.

Ich würde aber eh wie im Vorschlag von gfntom weitermachen, der ist eleganter!

1

Php hat dafür array_unique()

Java hat dafür distinct()

int[] noDuplicates = IntStream.of(array).distinct().toArray();

Und Javascript kann das nur mit filter() bewerkstelligen soweit ich weiß


PhotonX  18.04.2022, 17:52

Man soll es doch von Hand, ohne Hilfsmethoden umsetzen, oder?

0
TechPech1984  18.04.2022, 17:56

wieder jemand der die frage zwar gelesen hat aber nicht verstanden.

0

Hey,

da es ganz ohne Hilfsmethoden sein soll, wäre das hier mein Ansatz:

private static int[] deleteEquals(int[] ia) {
    printArray(ia);
    for (int i = 0; i < ia.length - 1; i++) {
        for (int j = i + 1; j < ia.length; j++) {
            if (ia[i] == ia[j]) {

                int[] reduced = new int[ia.length - 1];
                for (int k = 0; k < reduced.length; k++) {
                    if (k < j) {
                        reduced[k] = ia[k];
                    } else {
                        reduced[k] = ia[k + 1];
                    }
                }
                return deleteEquals(reduced);

            }
        }
    }
    return ia;
}

Mfg Jannick (L1nd)

Woher ich das weiß:eigene Erfahrung

Du kannst ein Set verwenden. Ein Set kann keine Duplikate enthalten. So kannst du einfach durchloopen, die Elemente dem Set hinzufügen und dieses anschließend via toArray als Array zurückgeben.

Ansonsten musst du eben immer prüfen, ob du den Wert schon hast. Selbst da wäre dann ein Set von der Time Complexity sinnvoller bzw. das Doppelte pflegen. Ist aber natürlich ziemlich baller baller ein Set zu machen um zu schauen, ob das Element schon in deinem Array ist und daneben das Array zu pflegen.

Vermutlich solltest du die langsamste Methode nutzen, die man so nie nutzen würde und da einfach drüber loopen, damit es "per Hand" gemacht wird.

Frage ist eben was für deinen Lehrer eine Hilfsmethode ist bzw. ob die Verwendung der dafür richten Datenstruktur (Set) das schon ist.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012

Du holst das nächste Element vom alten Array und überprüfst, ob es bereits im neuen Array enthalten ist ( neues Array durchlaufen, bis entweder gefunden oder Array zu ende). Wenn nein, wird das Element dem neuen Array angefügt und die Länge des selben um 1 vergrößert.


leKAzz203 
Fragesteller
 18.04.2022, 17:56

Eigentlich so, wie es der @PhotonX erklärt hat, oder

0
leKAzz203 
Fragesteller
 18.04.2022, 17:58

Ich bin grad bisschen verwirrt, kannst du es mir bitte mit einem kurzen Beispiel erklären?

0
MrAmazing2  18.04.2022, 18:15
@leKAzz203

Du gehst das gegebene Array Element für Element durch. Ganz normal mit einer for-Schleife.

Du fügst das jeweilige Element in ein neues Array ein, sofern es darin noch nicht vorhanden ist

0
FouLou  18.04.2022, 18:01

Das wäre auch nein allererster Gedanke gewesen. Und wenn der Lehrer meint man hätte doch Bitteschön das gegebene Array abändern sollen klatscht man ihm die Aufgabe ordentlich und die Ohren. XD

0