2010-12-16 18 views
0

Sag mal, ich habe zwei Verweise auf ein Objekt in einem LinkedList List1:Iterate durch verlinkte Liste in Java

LinkedList<Object> List1 = new LinkedList<Object>(); 
Object first; 
Object last; 

Ich will nicht den Listenindex dieser Objekte verwenden, um sie zu beziehen, weil die Länge meiner Liste ändert sich. Ich denke, das würde nicht funktionieren. Nun möchte ich die durch die erste und letzte definierte Unterliste durchlaufen, wobei zuerst der Anfang der Unterliste in Liste1 definiert wird und zuletzt das Ende der Unterliste in Liste1 definiert wird.

Mein Problem ist jetzt, dass AFAIK kann ich nicht etwas tun, wie

while (current != last){ 
// do something 
current = someiterator.next(); 

} 

, weil ich zwei Objekte bin vergleichen, die in allgemeinem Willen Punkt zu verschiedenen Orten. Darüber hinaus kann ich die Referenzen auch nicht nach ihrem Wert vergleichen, da in der Liste ein Wert mehrmals vorkommen kann. Also, wie kann ich durch diese Unterliste von List1 iterieren?

Antwort

4

Nein , Ihr Vergleich while (current != last) wird gut funktionieren. In Java leben Objekte auf dem Heap und Sie arbeiten nur mit Referenzen. Der Vergleich zweier Referenzen mit == ergibt true, wenn sie sich auf das gleiche Objekt beziehen, was genau das zu sein scheint, was Sie wollen.

+0

okay, also wenn ich sowas mache wie last = List1.get (2) und später später den Vergleich mit einem Iterator, wie "while (current! = Last)", dann sollte der Vergleich die zwei Objekte vergleichen, die ich wirklich möchte vergleichen? – ptikobj

+0

Ich glaube, da war etwas, das ich nicht realisiert habe: Wenn Sie etwas tun wie Objekt a = b; dann wird ein _reference_ zu Objekt b halten, oder? und da a den Verweis auf b enthält, kann ich etwas wie während (a! = Strom) tun. Zuerst dachte ich, dass a = b das _object_ oder den _value_ von b zu a zuweisen würde. Der Wert wird jedoch nur a zugewiesen, wenn b ein Primitiv ist. Und wenn b ein Objekt ist, dann wird a nur die Referenz von b enthalten. Danke für all deine Antworten, ich denke ich habe es jetzt bekommen. – ptikobj

+0

@ptikobj: Das Objekt hat eigentlich keinen Namen. Weder "a" noch "b" ist das Objekt. Stattdessen enthalten * beide * Referenzen auf das Objekt und haben daher den gleichen Wert im Vergleich zu '==' –

6

Sie so etwas wie

list1.sublist(list1.indexOf(first), list1.indexOf(last)) 

Ok verwenden könnte, ich glaube, ich verstehe Ihre Frage besser. Die obige Methode verwendet die Methode .equals und vergleicht daher keine Referenzen. Hier ist wahrscheinlich eine bessere Lösung für Sie:

import java.util.*; 

public class Test { 

    public static void main(String[] args) { 

     String first = "beta"; 
     String last = "delta"; 

     List<String> list1 = new LinkedList<String>(); 
     list1.add("alpha"); 
     list1.add(first); 
     list1.add("gamma"); 
     list1.add(last); 
     list1.add("epsilon"); 

     boolean firstFound = false; 
     for (String s : list1) { 

      if (firstFound || (firstFound = s == first)) 
       System.out.println(s); 

      if (s == last) 
       break; 
     } 
    } 
} 
+0

okay, aber da erste und letzte Objekte wirklich sind (keine primitiven Typen), sollte list1.indexOf (first) das "erste" Objekt zurückgeben, dem ich es zugewiesen habe (in einer anderen Methode). Wird es das "richtige" "erste" Objekt definitiv zurückgeben? – ptikobj

+0

nicht sicher, ich verstehe Ihren Kommentar. – aioobe

+0

Sache ist, indexOf (someobject) gibt das _first_ Vorkommen eines Objekts in List1 zurück. In meinem Fall kann es jedoch mehrere Objekte mit demselben Wert geben. Da ich neu in Java bin, ist meine Frage eher: behandelt Java diese Objekte mit dem gleichen Wert wie verschiedene Objekte? – ptikobj

0

Wenn Sie nicht weder auf == noch .equals() verlassen, ich sehe nicht, wie Sie möglicherweise eine Unterliste definieren könnte ...

+0

Ich meine, was ich eigentlich will, ist so etwas wie ein Zeiger (wie in C++) auf den ersten und einen Zeiger auf den letzten. Dieser Zeiger sollte gleich bleiben und immer noch auf das Element zeigen, dem ich ihn zugewiesen habe. – ptikobj

0

Sie sollten Object.equals() verwenden, um Ihre Objekte zu vergleichen. Wenn Ihre Objekte reale Objekte sind und nicht primitiv oder Strings (sie gleich, wenn ihr Wert gleich) Sie sollte so tun können:

boolean start = false; 
for(Object o : list){ 
    if(o.equals(first){ 
     start = true; 
    }else if(o.equals(last)){ 
     break; 
    } 
    if(start){ 
     // do something 
    } 
} 

Oder eher verwenden, um die Antwort von aioobe

0

Eine Möglichkeit ist nicht zu fügen Sie die Objekte direkt, sondern einen Wrapper zu erstellen, so dass Sie

List<WrapperObject<Object>> aList = new LinkedList<WrapperObject<Object>>(); 

Jetzt haben Sie die Gleichheit der Einträge, indem Sie die Wrapper anstelle der umwickelten Objekte überprüfen können.