2008-09-27 14 views
7

Ich bin es gewohnt, mit PHP zu arbeiten, aber in letzter Zeit habe ich mit Java gearbeitet und habe Kopfschmerzen, um das herauszufinden. Ich mag diese Darstellung in Java speichern:Java: Arrays & Vektoren

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

Gibt es eine saubere Art und Weise (das heißt kein schmutziger Code) dieses Ding in Java zu retten? Hinweis; Ich möchte Strings als Array-Indizes (in der ersten Dimension) verwenden und ich kenne die definitive Größe der Arrays nicht.

Antwort

12

Sie können eine Karte und eine Liste verwenden (diese sind beide Schnittstellen implementiert in mehr als einer Weise für Sie, um das passendste in Ihrem Fall zu wählen).

Weitere Informationen finden Sie in den Lernprogrammen für Map und List und vielleicht sollten Sie mit dem Collections Tutorial beginnen.

Ein Beispiel:

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

Sie möchten eine Map, die von fast allem codiert werden. HashMap s funktionieren in den meisten Fällen.

So etwas wie das.

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

Wenn Sie etwas einfachere wollen, muss die commons-lang Bibliothek eine MultiMap.

15

Versuchen Sie mit einem Map<String, List<String>>. Dies ermöglicht Ihnen, Strings als Schlüssel/Indizes in die äußere Map zu verwenden und ein Ergebnis als Liste von Strings als Werte zu erhalten. Sie werden wahrscheinlich eine HashMap für die äußere Karte und ArrayList für die inneren Listen verwenden wollen.

Wenn Sie etwas sauberen Code wollen, die dem PHP Sie es zu initialisieren gab ähnlich ist, können Sie etwas tun:

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

seien Sie gewarnt, dass die Vector Legacy-Code für die Kollektionen Rahmen ist. Es synchronisiert den Zugriff auf seine Elemente, was die Leistung verlangsamt. Die meisten Anwendungsfälle für die Verwendung der Liste benötigen diese Art von Thread-Sicherheit nicht, und selbst wenn Sie dies tun würden, wäre ich eher geneigt, die CopyOnWriteArrayList zu verwenden.