2010-12-16 2 views
0

Say, j'ai deux références à un objet dans une LinkedList List1:Itérer par liste chaînée en Java

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

Je ne veux pas utiliser l'index de la liste de ces objets pour se référer à eux, parce que la longueur de ma liste change. Je pense que cela ne marcherait pas. Maintenant, je veux parcourir la sous-liste définie par le premier et le dernier, où le premier définit le début de la sous-liste dans List1 et définit en dernier la fin de la sous-liste dans List1.

Mon problème est maintenant que je ne peux pas AFAIK faire quelque chose comme

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

} 

parce que je compare deux objets au point général de volonté à des endroits différents. De plus, je ne peux pas non plus comparer les références par leur valeur, car la liste peut avoir une valeur apparaissant plusieurs fois. Alors, comment puis-je itérer à travers cette sous-liste de List1?

Répondre

4

Non , votre comparaison while (current != last) fonctionnera bien. En Java, les objets vivent sur le tas et vous travaillez uniquement avec des références. La comparaison de deux références en utilisant == renvoie true si elles se réfèrent au même objet, ce qui semble être exactement ce que vous voulez.

+0

okay, donc si je fais quelque chose comme last = List1.get (2) et ensuite comparer plus tard dernier contre un itérateur, comme "while (current! = Last)" alors la comparaison devrait comparer les deux objets que je veux vraiment comparer? – ptikobj

+0

Je pense qu'il y avait quelque chose que je n'avais pas réalisé: Si vous faites quelque chose comme Objet a = b; puis un tiendra la référence à l'objet b, non? et comme a contient la référence à b, je peux faire quelque chose comme while (a! = Current). Initialement, je pensais que a = b assignerait l'objet ou la valeur de b à a. Cependant, la valeur n'est affectée qu'à a si b est une primitive. Et si b est un objet, alors un ne tiendra que la référence de b. Merci pour toutes vos réponses, je pense que je l'ai maintenant. – ptikobj

+0

@ptikobj: L'objet n'a pas vraiment de nom. Ni «a» ni «b» ne sont «l'objet». Au lieu de cela, * both * contiennent des références à l'objet, et ont donc la même valeur par rapport à '==' –

6

Vous pouvez utiliser quelque chose comme

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

Ok, je pense que je comprends mieux votre question maintenant. La méthode ci-dessus utilise la méthode .equals et ne compare donc pas les références. Voici probablement une meilleure solution pour vous:

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, mais puisque le premier et le dernier sont vraiment des objets (pas de types primitifs), list1.indexOf (first) devrait retourner le "premier" objet auquel je l'ai assigné (dans une autre méthode). Renverra-t-il définitivement le "premier" objet? – ptikobj

+0

pas sûr de comprendre votre commentaire. – aioobe

+0

chose est, indexOf (someobject) renvoie l'occurence _first_ d'un objet dans List1. Dans mon cas cependant, il peut y avoir plusieurs objets avec la même valeur. Depuis que je suis nouveau à Java, ma question est plutôt: Java traite-t-il ces objets avec la même valeur que des objets différents? – ptikobj

0

Si vous ne pouvez pas compter ni sur == ni equals(), je ne vois pas comment vous pourriez définir une sous-liste ...

+0

Je veux dire, ce que je veux vraiment, c'est quelque chose comme un pointeur (comme en C++) en premier et un pointeur en dernier. Ces pointeurs doivent rester les mêmes et pointer vers l'élément auquel ils sont affectés en premier lieu. – ptikobj

0

Vous devez utiliser Object.equals() pour comparer vos objets. Si vos objets sont des objets réels et non primitifs ou des chaînes (ils sont égaux si leur valeur est égale à), vous devriez être en mesure de le faire:

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

Ou plutôt utiliser la réponse de aioobe

0

Une façon est de ne pas ajouter les objets directement, mais pour créer une enveloppe, de sorte que vous aurez

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

vous pouvez maintenant vérifier l'égalité des entrées en vérifiant les emballages au lieu des objets emballés.