2010-06-07 9 views
2

J'ai créé une pile Java et ajouté des objets personnalisés. Ces objets contiennent des identifiants uniques comme l'un de leurs champs. J'ai besoin d'obtenir l'index de cet objet dans la pile en fonction du nom unique. S'il vous plaît trouver l'exemple.Rechercher dans la pile

class TestVO{ 

private String name; 
private String uniqueId; 
//getters and setters 
} 
public class TestStack{ 
public static void main(String args[]){ 
    TestVO vo1=new TestVO(); 
TestVO vo2=new TestVO(); 
TestVO vo3=new TestVO(); 

vo1.setName("Test Name 1") 
vo1.setId("123") 

vo2.setName("Test name 2"); 
vo2.setId("234"); 

Stack<TestVO> stack=new Stack<TestVO>(); 
stack.add(vo1); 
stack.add(vo2); 

//I need to get the index of a VO from stack using it's unique ID 
} 

} 

Est-ce que quelqu'un peut m'aider à implémenter cela?

+1

Pourquoi avez-vous besoin d'utiliser une pile? Une pile n'est pas appropriée pour cela. Est-ce que ce sont les devoirs? – strager

+1

J'ai besoin de construire une navigation de fil d'Ariane. Je pensais que la pile est pratique pour ça. – Apps

Répondre

4

Tout d'abord, mettre en œuvre le hashCode et égaux méthodes de TestVO classe:

class TestVO{ 

private String name; 
private String uniqueId; 

public boolean hashCode() { 
    if (uniqueId == null) return 0; 
    return uniqueId.hashCode(); 
} 

public boolean equals(Object o) { 
    if (o instanceof TestVO) { 
    TestVO other = (TestVO) o; 
    return o.uniqueId.equals(uniqueId); 
    } 
    return false; 
} 
//getters and setters 
} 

S'il vous plaît noter que dans la méthode equals vous devez ajouter du code supplémentaire pour vérifier que o.uniqueId est non nul.

Maintenant, vous pouvez trouver l'index d'un objet TestVO en utilisant son uniqueId en utilisant ce code:

int index = stack.indexOf(vo1); 
+0

+1 L'opérateur 'instanceof' renvoie' false' sur 'null', donc une vérification explicite est inutile: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20. 2 – trashgod

+0

Mais o.uniqueId peut toujours être nul. – Behrang

+0

@Stephen C répond à cette question efficacement. – trashgod

2

Vous pouvez utiliser la méthode search pour Stack. Cela retournera la distance de cet objet par rapport au sommet de la pile. J'espère que c'est assez bon. Vous aurez besoin de définir la méthode equals - ce qui devrait être assez facile - il suffit de faire une comparaison sur votre champ id.

Java API Documentation

+0

Merci beaucoup Daniel. Pourriez-vous s'il vous plaît laissez-moi savoir si la méthode d'égalisation est la meilleure façon de le faire? Y at-il un moyen d'y parvenir sans modifier le code VO? – Apps

+0

Je suppose que si vous ne pouvez pas changer cette classe, la meilleure alternative serait de créer une sous-classe et de surcharger la méthode equals. Ensuite, vous venez de lancer à la nouvelle sous-classe (je pense que cela fonctionne, mieux essayer par vous-même!) Lorsque vous poussez sur la pile. Cela, ou simplement utiliser la nouvelle classe lors de la création d'objets. –

+0

@WPS: 'search() utilise' equals() '. @Daniel: +1 Pensez à citer un lien plus récent. – trashgod

2

Si vous allez baser votre notion d'égalité sur le terrain uniqueId, alors vous devriez probablement prendre des mesures pour assurez-vous que le champ est correctement initialisé et qu'il ne change pas une fois qu'il a été initialisé.

Si vous fournissez un accesseur sans restriction pour le champ, vous obtiendrez toutes sortes de comportements brisés si une partie du code modifie le champ après que l'objet TestVO a été inséré dans un ensemble ou une carte.