Integer aus einer LinkedList entfernen kann so kompliziert sein–in Java!
Freitag, 4. Mai 2012 13:48 | Autor: liskel
Ein kleines Problem, das sich bei der Verwendung von Integer- LinkedLists, ArrayLists und HashSets einschleichen kann ist die Verwendung von remove. Remove wird verwendet, um ein Element der LinkedList, der ArrayList oder des HashSets zu entfernen. An einem Beispiel mit einer LinkedList lässt sich das Problem einfach veranschaulichen:
| java | | copy code | | ? |
| 01 | import java.util.LinkedList; |
| 02 | |
| 03 | public class LLTest {
|
| 04 | private static LinkedList<Integer> intList = new LinkedList<Integer>(); |
| 05 | |
| 06 | public static void main(String[] args) {
|
| 07 | intList.add(1); |
| 08 | intList.add(2); |
| 09 | intList.add(3); |
| 10 | intList.remove(1); |
| 11 | |
| 12 | for (int i = 0; i < intList.size(); i++) {
|
| 13 | System.out.println(intList.get(i)); |
| 14 | } |
| 15 | } |
| 16 | } |
Das Programm müsste beim ersten Blick der LinkedList intList die Werte 1, 2 und 3 zuweisen und im Anschluss die 1 wieder entfernen. Denkste! Entfernt wird die 2, da sie das Erste Element der Liste ist (zero-based: bei 0 angefangen zu zählen). intList.remove(i) entfernt somit das Datum an index i.
Aber wenn nun eine LinkedList mit Strings gefüllt wird, ist auch das Entfernen mit name.remove(“Hello”) möglich.
Woran aber liegt diese unterschiedliche Interpretation in Java?
Nun, laut API sind für remove() zwei Argumente definiert remove(int index) und remove(Object o). Das Problem: Hier entscheidet sich Java, den index zu benutzen, da dieser ja ebenfalls ein IntegerWert ist. Das ganze findet man im Netz und in Foren unter dem Stichwort Autoboxing zu Hauf behandelt.
Die Lösung/Umgehung des Problems ist denkbar einfach aber auch recht unschön und erscheint vielleicht überflüssig und überladen. Durch das vorherige Casten der Variablen wird abgesichert, dass der Compiler den Typ “sieht” den der Programmierer verlangt. So tut etwa der Aufruf
| java | | copy code | | ? |
| 10 | intList.remove((Integer) 1); |
das gewünschte; Der Eintrag mit dem Inhalt 1 wird entfernt.
Mehr zum Autoboxing und der Umwandlung von primitiven Datentypen in Wrapper und umgekehrt, gibts in dem OpenBook Java ist auch eine Insel.
Thema: Java | Kommentare (0)