2013-04-23 3 views
0

Je dois créer une classe de couloir qui aura à l'intérieur 2 ArrayLists des objets Stand, un pour les stands sur la droite, et l'autre pour ceux sur la gauche.Collections Java

Mon intention est de placer ces ArrayLists dans une autre collection de cette classe.

Je ne sais pas si je devrais utiliser un Hashtable, une carte, etc.

Plus important encore, mon intention est d'accéder ensuite ces ArrayLists en utilisant une méthode comme:

TheHashTable [ » Droite "]. Add (standObject); // Ajoute un support à la ArrayList de droite qui se trouve dans une table de hachage.

Exemple:

public class Hallway {  

     private Hashtable< String, ArrayList<<Stand> > stands; 

     Hallway(){ 
     // Create 2 ArrayList<Stand>) 
     this.stands.put("Right", RightStands); 
     this.stands.put("Left", LeftStands); 
     }  

     public void addStand(Stand s){ 
     this.stands["Right"].add(s); 
     } 
} 

Serait-ce possible?

Répondre

1

Si je comprends bien votre question clairement, alors c'est ce que vous voulez:

public void addStand(Stand s){ 
this.stand.get("Right").add(s); 
} 

Mais une meilleure approche serait d'utiliser Map au lieu de Hashtable.

public class Hallway { 

private Map< String, ArrayList<<Stand> > stands; 
private List<Stand> RightStands; 
private List<Stand> LeftStands; 

Hallway(){ 
    stands = new HashMap(); 
    RightStands = new ArrayList(); 
    LeftStands = new ArrayList(); 
    this.stands.put("Right", RightStands); 
    this.stands.put("Left", LeftStands); 
    }  

    public void addStand(Stand s){ 
    this.stands.get("Right").add(s); 
    } 
} 
2

Si vous avez seulement à droite et à gauche, vous pouvez par exemple simplement créer 2 listes de tableaux.

private ArrayList<Stand> rightStands; 
private ArrayList<Stand> leftStands; 
+0

oui, je pensais à ce sujet. Mais de cette façon je ne peux pas accéder aux ArrayLists comme > this.stands ["Right"]. Add (s); – user2311962

+1

cette syntaxe n'est pas correcte, et pourquoi voulez-vous y accéder comme ça? – Vegard

0

Vous avez besoin d'un multi-carte, par exemple de Commons Collections ou Guava.

Ceux-ci vous permettront de mapper plusieurs valeurs (Stand1, Stand2, ...) à une seule touche (par exemple "droite").

Par exemple (avec Collections communes):

MultiMap stands = new MultiHashMap(); 
stands.put("left", new Stand()); 
stands.put("left", new Stand()); 
stands.put("right", new Stand()); 
stands.put("right", new Stand()); 
stands.put("right", new Stand()); 
Collection standsOnLeftSide = (Collection) stands.get("left"); 

Je pense cependant que Guava est préférable parce qu'il prend en charge Generics.

3

C'est possible, mais je déconseille. Si vous avez seulement deux emplacements de stand, il serait beaucoup plus clair d'avoir simplement deux variables de type List<Stand>: leftStands et rightStands, et d'avoir des méthodes correspondantes: addLeftStand(Stand), addRightStand(Stand), etc. Le code serait beaucoup plus clair, plus simple et plus sûr.

Si vous voulez vraiment suivre votre chemin, les clés de la carte ne doivent pas être des chaînes. L'appelant ne saura pas quelle touche passer à vos méthodes (il y a une infinité de cordes), et s'il sait que les clés sont "Droite" et "Gauche", il pourrait faire une faute de frappe qui passerait inaperçue compilateur. Vous devez utiliser un ENUM à la place, ce qui rendrait le code auto-documenté et plus sûr:

public enum Location { 
    LEFT, RIGHT 
} 

private Map<Location, List<Stand>> stands = new HashMap<Location, List<Stand>>(); 

public Hallway() { 
    for (Location location : Location.values()) { 
     stands.put(location, new ArrayList<Stand>()); 
    } 
} 

public void addStand(Location location, Stand stand) { 
    stands.get(location).add(stand); 
} 
+0

Pourrais-je suggérer 'pour (Emplacement l: Location.values ​​()) {stands.put (l, nouvelle ArrayList ()); } 'dans le constructeur? Dans ce cas, si plus d'emplacements sont ajoutés, ils seront initialisés. – msandiford

+0

@msandiford: accepté. Je vais changer ma réponse. –

0

Ne pas utiliser Hashtable. Il a été abandonné depuis longtemps. Utilisez TreeMap ou HashMap.

List<Stand> right=new ArrayList<Stand>(),left=new ArrayList<Stand>(); 
Map<String,List<Stand> > stands= new HashMap<String, List<Stand> >(); 
stands.put("right",right); 
stands.put("left",left); 

Pour en apprendre davantage sur les cartes et de décider ce qui convient le mieux lire la carte vous Precisely Concise: Java Maps