Aus einem Array doppelte Zahlen löschen ohne Hilfsmethoden?
Schreibe die Methode
int[] deleteEquals(int[] ia)
die aus dem Array
ia
alle doppelten Zahlen herauslöscht und das (wahrscheinlich kürzere) Array zurückgibt.
Dafür sind sicher mehrere Zwischenschritte notwendig.
Beispiel:
Das Array
{1, 3, 3, 1, 2, 1, 5}
nach dem Löschen der doppelten Zahlen:
{1, 3, 2, 5}
.
Mit Hilfsmethoden wäre es ja ganz einfach, aber wie soll man es ohne Hilfsmethoden machen? Ich hätte eine Idee, die immer jeden char (ia [i+1] ) in einer forschleife aufs ganze array überprüft also wieder von 0 beginnt und bis zum ende sucht, ob es die gleiche zahl ist und wenn es die gleiche zahl ist dann soll sie gelöscht werden. Jedoch weiß ich nicht wie ich es in der Praxis umsetzen muss
5 Antworten
Das ganze Array braucht man nicht jedes Mal durchsuchen, es reicht, die Elemente rechts vom aktuellen Element zu überprüfen, oder?
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.
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;
}
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!
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ß
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)
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.
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.
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
Ich bin grad bisschen verwirrt, kannst du es mir bitte mit einem kurzen Beispiel erklären?
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
Ich weiß leider nicht, was du genau meinst... Kannst du es mir bitte mit paar Beispielen erklären?