web-dev-qa-db-ja.com

ArrayList <ArrayList <String >>()の値(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);

ArrayListのArrayListからStringを取得したいのですが、その方法がわかりません。たとえば、私は行く

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

そしてそれは動作します!しかし:

大きな更新:

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

java.lang.IndexOutOfBoundsException:インデックス1が無効です。本当に存在するはずのアイテムをクリックすると、サイズが0になります。 ListViewを生成するコードは表示しませんでしたが、listOfSには3つの項目が含まれていることがわかります。1つ目はNull listOfZ、2つ目は2つの要素、3つ目のlistOfZは1つの要素です。

10
boski
_listOfSomething.Clear();
listOfSomething.Add("first");
collection.Add(listOfSomething);
_

ここでリストをクリアして1つの要素(「最初」)を追加すると、listOfSomethingの最初の参照も更新されるため、両方が同じオブジェクトを参照するため、2番目の要素にアクセスするとmyList.get(1)(もう存在しません)nullを取得します。

両方のcollection.Add(listOfSomething);が同じarraylistオブジェクトへの2つの参照を保存していることに注意してください。

2つの要素に対して2つの異なるインスタンスを作成する必要があります。

_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);
_
12
CloudyMarble

リストをクリアした後、2番目の要素はnullであるためです。

つかいます:

String s = myList.get(0);

インデックス0が最初の要素であることを忘れないでください。

11
BobTheBuilder

リスト内のリストを反復処理する正しい方法は次のとおりです。

//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);
    }
}
5
Nermeen

リストを反復するよりクリーンな方法は次のとおりです。

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