2013-04-23 3 views
0

Мне нужно создать класс прихожей, который будет внутри 2 ArrayLists предметов стенда, один для стендов справа, а другой для остальных слева.Коллекции Java

Мое намерение состоит в том, чтобы поставить эти ArrayLists внутри другой коллекции этого класса.

Я не знаю, должен ли я использовать Hashtable, карта, и т.д.

Что еще более важно, мое намерение состоит в том, чтобы затем получить доступ к этим ArrayLists, используя метод, как:

TheHashTable [» Право "] добавить (standObject). // Добавить подставку вправо. ArrayList, находящийся внутри Hashtable.

Пример:

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); 
     } 
} 

Будет ли это возможно?

ответ

1

Если я ясно понял ваш вопрос, то это то, что вы хотите:

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

Но лучше было бы использовать Map вместо 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

Если у вас есть только права и слева, вы можете, например, просто создать 2 списка массивов.

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

да, я думал об этом. Но таким образом я не могу получить доступ к ArrayLists, например > this.stands ["Right"]. Add (s); – user2311962

+1

Неправильный синтаксис и почему вы хотите получить к нему доступ? – Vegard

0

Вам нужен мульти-карту, например, из Commons Collections или Guava.

Это позволит вам сопоставить несколько значений (Stand1, Stand2, ...) с одной клавишей (например, «справа»).

Например (с Commons Collections):

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"); 

Я думаю, хотя это Гуава preferrable, поскольку он поддерживает дженериков.

3

Возможно, но я бы посоветовал это сделать. Если у вас есть только два места для стендов, было бы гораздо проще и проще иметь две переменные типа List<Stand>: leftStands и rightStands, а также иметь соответствующие методы: addLeftStand(Stand), addRightStand(Stand) и т. Д. Код был бы намного понятнее, проще и безопаснее.

Если вы действительно хотите идти своим путем, ключи карты не должны быть строками. Вызывающий не знал бы, какой ключ должен пройти к вашим методам (есть бесконечность строк), и если он знает, что клавиши «Right» и «Left», он может сделать опечатку, которая останется незамеченной компилятор. Вместо этого вы должны использовать перечисление, которое сделает код самодокументированным и безопасным:

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

Могу ли я предложить 'for (Location l: Location.values ​​()) {tasks.put (l, new ArrayList ()); } 'в конструкторе? В этом случае, если добавлено больше мест, они будут инициализированы. – msandiford

+0

@ msandiford: согласен. Я изменю свой ответ. –

0

Не используйте HashTable. Он устарел давно. Используйте TreeMap или 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); 

Чтобы узнать о картах и ​​решить, какие карты подходит вам лучше всего прочитать Precisely Concise: Java Maps

Смежные вопросы