2013-04-11 14 views
9

Ich weiß, es einfache Frage ist, aber inGet Wert (String) von ArrayList <ArrayList <String>>(); in Java

ArrayList<ArrayList<String>> collection; 
ArrayList<String> listOfSomething; 

collection= new ArrayList<ArrayList<String>>(); 
listOfSomething = new ArrayList<String>(); 

listOfSomething.Add("first"); 
listOfSomething.Add("second"); 
collection.Add(listOfSomething); 
listOfSomething.Clear(); 
listOfSomething.Add("first"); 
collection.Add(listOfSomething); 

Ich mag String von Arraylist von Arraylist nehmen, und ich weiß nicht, wie das zu tun. Zum Beispiel gehe ich

ArrayList<String> myList = collection.get(0); 
String s = myList.get(0); 

und es funktioniert! aber:

Großes Update:

private List<S> valuesS; 
private List<Z> valuesZ; 


ArrayList<ArrayList<String>> listOfS; 
ArrayList<String> listOfZ; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
     Zdatasource = new ZDataSource(this); 
     Zdatasource.open(); 
     valuesZ = Zdatasource.getAllZ(); 

     Sdatasource = new SDataSource(this); 
     Sdatasource.open(); 
     valuesS = Sdatasource.getAllS(); 

     List<Map<String, String>> groupData 
      = new ArrayList<Map<String, String>>(); 
     List<List<Map<String, String>>> childData 
      = new ArrayList<List<Map<String, String>>>(); 

     listOfS = new ArrayList<ArrayList<String>>(); 
     listOfZ = new ArrayList<String>(); 
     for (S i : valuesS) { // S is class 
      for (Z j : valuesZ) { // Z is class 
       if(j.getNumerS().equals(i.getNumerS())) { 
        listOfZ.add(j.getNumerZ()); 
       } 
       else 
       { 
        //listOfZ.add("nothing"); 
       } 
      } 
       listOfS.add(listOfZ); 
       if(!listOf.isEmpty()) listOfZ.clear(); 
     } 



@Override 
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, 
      int childPosition, long id) { 
     try 
     {  
      ArrayList<String> myList = listOfS.get(groupPosition); 
      String s = myList.get(childPosition); 
     PrintToast("group "+Integer.toString(groupPosition)+", child "+Integer.toString(childPosition) + " , "+ s); 
     } 
     catch(Exception e) 
     { 
      Log.e("FS", e.toString()); 
     } 
     return true; 
    } 

Rückkehr mich java.lang.IndexOutOfBoundsException: Ungültige Index 1, Größe 0 ist, wenn ich auf Element klicken, die wirklich existieren sollten. Ich habe keinen Code angezeigt, der ListView generiert, aber ich kann Ihnen sagen, dass mein listOfS 3 Elemente enthält: Zuerst ist Null listOfZ, zweite listOfZ hat 2 Elemente, dritte listOfZ hat 1 Element bekommen.

+0

Sie erhalten null auf denen nennen - zu myList oder String s? – drewmoore

+6

Wenn Sie null haben, bedeutet dies, dass das zweite Element der ersten Liste in der Auflistung null ist. Wie können wir helfen? –

+0

Nun, ich werde meine Frage aktualisieren. – boski

Antwort

12
listOfSomething.Clear(); 
listOfSomething.Add("first"); 
collection.Add(listOfSomething); 

Sie die Liste hier räumen und ein Element hinzugefügt wird („first“), wird die erste Referenz von listOfSomething aktualisiert Nun sonce beide Referenz das gleiche Objekt, so, wenn Sie auf das zweite Element myList.get(1) zugreifen (die nicht mehr existiert) erhalten Sie die Null.

Beachten Sie, dass beide collection.Add(listOfSomething); zwei Referenzen auf das gleiche Arraylist-Objekt speichern.

Sie benötigen zwei verschiedene Instanzen für zwei Elemente zu erstellen:

ArrayList<ArrayList<String>> collection = new ArrayList<ArrayList<String>>(); 

ArrayList<String> listOfSomething1 = new ArrayList<String>(); 
listOfSomething1.Add("first"); 
listOfSomething1.Add("second"); 

ArrayList<String> listOfSomething2 = new ArrayList<String>(); 
listOfSomething2.Add("first"); 

collection.Add(listOfSomething1);  
collection.Add(listOfSomething2); 
+0

Ja. Richtig. Ich benutze listOfZ = new ArrayList (); anstelle von listOfZ.clear(); – boski

4

Der richtige Weg in einer Liste innerhalb Liste iterieren ist:

//iterate on the general list 
for(int i = 0 ; i < collection.size() ; i++) { 
    ArrayList<String> currentList = collection.get(i); 
    //now iterate on the current list 
    for (int j = 0; j < currentList.size(); j++) { 
     String s = currentList.get(1); 
    } 
} 
11

Da das zweite Element null ist, nachdem Sie die Liste löschen.

Verwendung:

String s = myList.get(0); 

Und denken Sie daran, Index 0 ist das erste Element.

+0

Ja, das stimmte, aber ich schreibe Beispielcode und mache einen dummen Fehler. – boski

4

Eine sauberere Weg, um die Listen der Iterieren ist:

// initialise the collection 
collection = new ArrayList<ArrayList<String>>(); 
// iterate 
for (ArrayList<String> innerList : collection) { 
    for (String string : innerList) { 
     // do stuff with string 
    } 
} 
Verwandte Themen