2012-12-06 14 views
5

Potrzebuję utworzyć listę, która rejestruje dwie kolumny {int, String}. Myślę, że ArrayList jest tym, czego potrzebuję, ale nie mogę się z tym pogodzić. Wyciągnąłem łańcuchy z bazy danych, a int jest wartością indeksu, która jest potrzebna do identyfikacji pozycji łańcuchów na później.Jak zainicjować listę kolumn dwóch?

List<List<String>> strArray = ArrayList<List<String>>;

wtedy mógłby zrobić coś podobnego strArray.add(). Add() dla każdego wiersza I wyciągnąć z bazy danych?

+1

Jeśli identyfikatory są unikatowe, użyj hashap HashMap else utwórz nową klasę, która na liście może zawierać –

Odpowiedz

13

myślę, że należy użyć HashMap z int jako klucz i String jako wartości, jeśli wartości int będą unikalne.

Map<Integer,String> myMap = new HashMap<Integer,String>(); 
myMap.put(1,"ABC"); 

Należy pamiętać, że jest to jak Map zbiory i kolekcje Java nie przechowywać prymitywny jak int one przechowywać przedmioty więc trzeba użyć klasy Integer otoki dla wartości int.

sprawdź ten link Why can Java Collections not directly store Primitives types?

+0

Nie wiedziałem wcześniej o HashMap, ale myślę, że źle to wykorzystam, dzięki! – tozhan

0

Myślę, że można zawijać int i string w klasie, a następnie umieścić obiekty klasy na liście.

0

Mapa jest obiektem mapującym klucze do wartości. Mapa nie może zawierać duplikatów kluczy; każdy klucz może odwzorować najwyżej jedną wartość.

myślę, że byłoby lepiej, gdyby użyć Map<Integer,String> gdzie key(Integer) byłby indeks, który będzie wskazując String wartości.

Map<Integer,String> map = new HashMap<Integer,String>(); 
map.put(1,"str1"); 
map.put(2,"str2"); 
... 
+0

, użyj sparse array dla kombinacji liczb całkowitych. –

14

Innym rozwiązaniem byłoby zrobić niestandardowego obiektu:

Class CustomObject { 
    int value1; 
    String value2; 

    CustomObject(int v1, String v2) { 
     value1 = v1; 
     value2 = v2; 
    } 
} 

a następnie użyć go:

List<CustomObject> myList = new ArrayList<CustomObject>(); 
CustomObject o1 = new CustomObject(1, "one"); 
myList.add(o1); 
// etc. 

Jeśli wartości int są unikalne i chcesz do rozważenia ich kluczy, wtedy Map działałby tak, jak sugerowali inni.

2

Jeśli potrzebujesz tylko dwie wartości można użyć natywną Pair klasę

List<Pair> mPairs = new ArrayList<Pair>(); 

Pair pair = new Pair(123,"your string"); 
mPairs.add(pair); 

będzie to dobra decyzja, jeśli int wartości nie są niepowtarzalne, a więc nie można użyć HashMap

1

Jeśli Twoje identyfikatorów nie są unikalne, nadal można używać Mapa:

Map<Integer, String> map = new IdentityHashMap<Integer, String>(); 
map.put(new Integer(1), "string"); 

IdentityHashMap - używać ojczystego hashCode implementacja dla każdego obiektu, dzięki czemu nie trzeba unikalne identyfikatory, b ut MUSISZ stworzyć WSZYSTKIE liczby całkowite za pomocą operatora 'nowy', i nie używaj autoboxingu, ponieważ jest tam pewna liczba cache mechanism.

Istnieje również parametr JVM, który kontroluje rozmiar pamięci podręcznej "-XX: AutoBoxCacheMax =". Ale używając tego parametru nie można wyłączyć pamięci podręcznej, jeśli ustawisz rozmiar na zero, pamięć podręczna zignoruje go i użyje wartości domyślnej: [-128; 127]. Ten parametr jest tylko dla liczb całkowitych, nie ma takiego rodzaju parametru dla Long.

UPDATE także dla niezarejestrowanych unikatowych kluczy można użyć jakiegoś multimapy: Mapa> Mapa

i przechowywać w nim twoje wartości z kluczami nieunikatowe:

map.put(1, new ArrayList<String>()); 
map.get(1).add("value1"); 
map.get(1).add("value2"); 

Można użyć HashMap w tym na przykład.

Można również znaleźć implementację MultiMap w google-collections: "guava".

Powiązane problemy