2008-09-27 18 views
7

Jestem przyzwyczajony do pracy z PHP, ale ostatnio pracuję z Javą i mam bóle głowy, próbując to zrozumieć. Chcę zapisać reprezentację w Javie:Java: Tablice i wektory

 
Array ( 
     ["col_name_1"] => Array ( 
           1 => ["col_value_1"], 
           2 => ["col_value_2"], 
           ... , 
           n => ["col_value_n"] 
         ), 
     ["col_name_n"] => Array ( 
           1 => ["col_value_1"], 
           2 => ["col_value_2"], 
           ... , 
           n => ["col_value_n"] 
         ) 
) 

Czy jest czysty sposób (to znaczy nie brudny kod), aby zapisać tę rzecz w Java? Uwaga; Chciałbym użyć ciągów jako indeksów tablicowych (w pierwszym wymiarze) i nie znam dokładnej wielkości tablic.

Odpowiedz

12

Możesz korzystać z mapy i listy (te oba interfejsy realizowane w więcej niż jeden sposób, aby wybrać najbardziej odpowiedni w twoim przypadku).

Aby uzyskać więcej informacji, zapoznaj się z samouczkami dotyczącymi Map i List, a może warto zacząć od samouczka Collections.

Przykład:

import java.util.*; 

public class Foo { 
    public static void main(String[] args) { 
     Map<String, List<String>> m = new HashMap<String, List<String>>(); 
     List<String> l = new LinkedList<String>(); 
     l.add("col_value_1"); 
     l.add("col_value_2"); 
     //and so on 
     m.put("col_name_1",l); //repeat for the rest of the colnames 

     //then, to get it you do 

     List<String> rl = m.get("col_name_1"); 

    } 
} 
5

Chcesz mieć Map, które są prawie dowolne. HashMap s działają w większości przypadków.

Coś takiego.

List<String> col1Vals = new java.util.ArrayList<String>(); 
col1Vals.add("col_value_1"); 
col1Vals.add("col_value_2"); 
Map<String, List<String>> map = new HashMap<String, List<String>>(); 
map.put("col_name_1", col1Vals); 

Jeśli chcesz coś prostsze, biblioteka commons-lang ma MultiMap.

15

Spróbuj użyć urządzenia Map<String, List<String>>. Umożliwi to użycie łańcuchów jako kluczy/indeksów w zewnętrznej mapie i uzyskanie wyniku będącego listą łańcuchów jako wartości. Najprawdopodobniej będziesz potrzebował użyć HashMap dla zewnętrznej mapy i ArrayList dla wewnętrznych list.

Jeśli chcesz trochę czystego kodu, który jest podobny do PHP dałeś, aby go zainicjować, można zrobić coś takiego:

Map<String, List<String>> columns = new HashMap<String, List<String>>() {{ 
    put("col_name_1", Arrays.asList("col_val_1", "col_val_2", "col_val_n")); 
    put("col_name_2", Arrays.asList("col_val_1", "col_val_2", "col_val_n")); 
    put("col_name_n", Arrays.asList("col_val_1", "col_val_2", "col_val_n")); 
}}; 
2

Ostrzegam, że Vector jest starszy kod dla ram Collections. Synchronizuje dostęp do swoich elementów, co spowalnia działanie. Większość przypadków użycia List nie wymaga tego rodzaju bezpieczeństwa wątków, a nawet gdyby tak było, byłbym bardziej skłonny do korzystania z CopyOnWriteArrayList.