ArrayList.remove() entfernt nicht alles

  • Antworten:7
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 19

08.10.2014, 17:36:01 via Website

Moin!

Mein Problem ist folgendes:

Ich füge etwas in 'ne ArrayList ein:
methode a ()
{
System.out.println("Erstelle: " + mannschaft);
mannschaftErstellen(name,spiele,guv,tore,diff,pkt);
}

die Konsole zeigt alle Einträge richtig.

Dann passiert:

public static void mannschaftErstellen(String name,int spiele, int guv,  int tore, int diff, int punkte)
{

    System.out.println("Füge ein: " + name);
            mannschaftenArray.add(new Mannschaft(name,spiele,guv,tore,diff,punkte));


}

Die Konsole zeigt, dass alles eingefügt wird.

Dann drück ich einen Button und will alles löschen:

public static void clearList(){
System.out.println("Anfangsgröße: " + mannschaftenArray.size());
for (int i = 0; i <= mannschaftenArray.size(); i++)
{
System.out.println("Entferne: " + mannschaftenArray.get(i).getName());
mannschaftenArray.remove(mannschaftenArray.get(i));
}
System.out.println("Endgr&ouml;&szlig;e: " + mannschaftenArray.size());
}

Beim ersten Durchlauf löscht er nur 2 von 3 Elementen der ArrayList.
Die Endgröße ist dann 1.

Wenn ich den Knopf das zweite mal drücke, löscht er denn letzten Eintrag und die Endgröße ist = 0.
Das Problem entsteht auch, wenn ich (int i = 0; i <= mannschaftenArray.size()-1; i++) eingebe

Warum macht er das nicht gleich beim ersten durchlauf?

Antworten
  • Forum-Beiträge: 76

08.10.2014, 17:43:21 via App

weil die größe der arraylist sich nach jedem Durchlauf ändert (wird bei jedem Durchlauf um 1 verringert)

wenn du ein element am index 0 entfernst, dann wird in der arraylist intern das element an index 1 zu index 0 "verschoben".

wenn der index, also deine Variable i, dann größer als die Anzahl an Elementen in der Arraylist ist(wird nach jedem Durchlauf um 1 erhöht), bricht die Schleife ab, obwohl sich am index 0 noch ein element befindet.

Benutze einfach:

mannschaftenArray.clear();

— geändert am 08.10.2014, 17:46:18

Bernd Berndsen

Antworten
  • Forum-Beiträge: 19

08.10.2014, 17:48:53 via Website

Andreas S.

weil die größe der arraylist sich nach jedem Durchlauf ändert (wird bei jedem Durchlauf um 1 verringert)

wenn du ein element am index 0 entfernst, dann wird in der arraylist intern das element an index 1 zu index 0 "verschoben".

wenn der index, also deine Variable i, dann größer als die Anzahl an Elementen in der Arraylist ist(wird nach jedem Durchlauf um 1 erhöht), bricht die Schleife ab, obwohl sich am index 0 noch ein element befindet.

Benutze einfach:

mannschaftenArray.clear();

ja bin ich genie auch grad drauf gekommen^^

danke dir trotzdem ;)

Antworten
  • Forum-Beiträge: 11.185

08.10.2014, 17:51:52 via App

Warum so Umständlich mit Löschen?
Mach doch einfach die liste Neu.

deineList = new ArrayList<>();

Dann ist die Liste mit einem Befehl leer und du benötigst keine Schleife.

— geändert am 08.10.2014, 17:52:00

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.888

08.10.2014, 20:35:59 via App

Pascal P.

Warum so Umständlich mit Löschen?
Mach doch einfach die liste Neu.

deineList = new ArrayList<>();

Dann ist die Liste mit einem Befehl leer und du benötigst keine Schleife.

Da kann ich nur zustimmen :-P

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

Lebensmittelwarnung-App

Download Samsung Firmware Tool

Meine Wunschliste

Telegram News Feed

Antworten
  • Forum-Beiträge: 359

09.10.2014, 12:25:01 via Website

oder du nimmst clear ;)
Könnte etwas speicherschonender sein als new.
Da bei new ja erstmal jede menge schrott im Heap hängen bleibt bis der GC aufräumt.

— geändert am 09.10.2014, 12:26:59

Antworten
  • Forum-Beiträge: 3.112

09.10.2014, 17:38:26 via App

genau wie bei clear() ;)
Ob der GC bei clear() eher zuschlägt? Das weiß wahrscheinlich nur der GC selbst und ein paar Java freaks.

Antworten
  • Forum-Beiträge: 359

10.10.2014, 09:32:08 via Website

Naja ich vermute wenn einen Methode geschaffen wurde um ein Komplette Liste zu leeren, sollte man diese auch dafür verwenden, da es vermutlich die aufgabe optimal löst. ...

Antworten