2016-08-12 19 views
0

3つのレベルを配列リストに取得する必要があります。ここで私は、最終製品「rowList」を作成方法についての私のコードは次のとおりです。ArrayList内のArrayList内のArrayListから文字列を取得

ArrayList<ArrayList> rowList = new ArrayList<ArrayList>(); 
ArrayList<ArrayList<String>> appList =new ArrayList<ArrayList<String>>(); 
ArrayList<String> arr = new ArrayList<String>(); 

int Id = -1; 
int cc = rsmd.getColumnCount(); 
while(rs.next()){ 
    if(Id == -1){ 
     arr.add(rs.getString("name")); 
     Id= Integer.parseInt(rs.getString("Id")); 
    } 
    if(Id!= Integer.parseInt(rs.getString("Id"))){ 
     Id= Integer.parseInt(rs.getString("Id")); 
     rowList.add(appList); 
     appList = new ArrayList<ArrayList<String>>(); 
     arr.add(rs.getString("name")); 

    } 

    for(int i=2; i < rsmd.getColumnCount();i++){ 
     arr.add(rs.getString(rsmd.getColumnName(i))); 
    } 
    appList.add(arr); 
    arr = new ArrayList<>(); 
} 
rowList.add(appList); 

だから、エンドrowlistに次のようになります。

[0] 
    [0] 
    [0]Property 1 
    [1]Property 2 
    [2]Property 3 
    [1] 
    [0]Property 1 
    [1]Property 2 
    [2]Property 3 
[1] 
    [0] 
    [0]Property 1 
    [1]Property 2 
    [2]Property 3 
    [1] 
    [0]Property 1 
    [1]Property 2 
    [2]Property 3 

だから私の質問はに取得する方法だろうプロパティ、ネストされた配列の最後のレベル?文字列配列を返すためにrowList.get(0).get(0).get(0).get(0).get(0).get(0)を使用することはできません。エラー:シンボルを見つけることができません。

私はそれを取得して文字列に設定した後にプロパティを削除することもできます。その部分は簡単に処理できるので、重要ではありません。

ArrayList<ArrayList> rowList = new ArrayList<ArrayList>(); 

ArrayListを返しrowList.get(0):あなたは生のタイプを使用しているので、

+0

'Integer.parseInt(rs.getString(「ID」))を繰り返し呼び出しは'非常に冗長である... –

+0

私は私が手に言うとき:使用コンクリートの型の中にある程度の柔軟性を提供するために、文字列配列、私はこれを実行する場合を意味します:rowList.get(0).get(0).toString(); [Property1、Property2、Property3、Property4]を取得します。それは役に立ちますか? –

+0

'rowList'を取り込むコードを表示できますか? –

答えて

3

です。 Antoher .get(0)は生タイプを使用しているためObjectを返します。 Objectにはgetメソッドがありません。

しかし、ObjectにはtoStringというメソッドがあるので、toStringを呼び出すことができます。


単に宣言を変更するだけです。これは、ダイヤモンドを使用して容易に行うことができます。

ArrayList<ArrayList<ArrayList<String>>> rowList = new ArrayList<>(); 
ArrayList<ArrayList<String>> appList = new ArrayList<>(); 
ArrayList<String> arr = new ArrayList<>(); 
+0

これは動作しますが、rowListの直前に行が欠けています。私が確認したら、私は正しい答えとしてあなたをチェックします。 –

2

さて、チェーン通話rowList.get(0).get(0).get(0)の各結果のタイプについて考えてみましょう。これを行う最も簡単な方法は、各呼び出しをそれ自身の行に分割して、変数宣言に必要な型を見つけることができるようにすることです。まず、rowListの宣言を見てみましょう。今

ArrayList arr = rowList.get(0); 

rowList.get(0).get(0)arr.get(0)と同等です:

ArrayList<ArrayList> rowList = new ArrayList<ArrayList>(); 

これはrowList.get(0)ArrayListを返すことを教えてくれる。しかし、これはObjectを返します。

Object obj = arr.get(0); 

のでrowList.get(0).get(0).get(0)obj.get(0)と同等です。ただし、Objectにはget()という名前のメソッドはありません。このため、エラーメッセージが表示されます。

一般に、メソッド呼び出しを連鎖させるときは非常に注意が必要です。通常、この構文は、メソッドが呼び出し元オブジェクトへの参照を返す場合にのみ使用されます。そのようにして、戻り値の型は常に同じで、追跡するのがずっと簡単です。連続するメソッド呼び出しごとに戻り値の型が異なる場合は、追跡するのが難しい場合があります。

ArrayListが返されたのはrowList.get(0)です。問題は生の種類です。そのため別のget()コールはObjectを返します。あなたは「行」で、オブジェクトの種類を指定するには、ジェネリックを使用する必要があります:あなたがここで見るとおり

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

、ジェネリック医薬品は、すでにArrayListの最も外側のレベルのためにやったように任意の<>の内部型として使用することができますあなたの元のコードで。 (ArrayListを作成するときにJDK 7+で、あなたはダイヤモンド演算子を使用することができます。これは非常にすでに宣言の中に表示されるタイプの情報を複製低減します。)

いっそのこと、あなたがListインタフェースを使用して変数を宣言することができます

List<List<List<String>>> rowList = new ArrayList<>(); 
関連する問題