web-dev-qa-db-ja.com

Java ArrayList of Arrays?

固定サイズなしで多次元配列を作成したい。

String[2]のアイテムを追加できるようにする必要があります。

私は見てみました:

private ArrayList<String[]> action = new ArrayList<String[2]>();

しかし、それは機能しません。誰か他のアイデアはありますか?

43
Rumpleteaser

あるべき

private ArrayList<String[]> action = new ArrayList<String[]>();
action.add(new String[2]);
...

ジェネリックパラメーター内で配列のサイズを指定することはできません。特定のサイズの配列のみを後でリストに追加します。これは、コンパイラーがすべてのサブ配列が同じサイズであることを保証できないことも意味します。ユーザーが保証する必要があります。

より良い解決策は、これをクラス内にカプセル化することです。この場合、型の不変式として配列のサイズを均一にすることができます。

70
Péter Török

ところで。インターフェイスに対してコーディングすることをお勧めします。

private ArrayList<String[]> action = new ArrayList<String[]>();

あるべき

private List<String[]> action = new ArrayList<String[]>();
12
daniel

文字列配列のサイズはコンパイル時に固定されるので、正確に2つのフィールドを必須とする構造(Pairなど)を使用する方がよいでしょう。

コード:

JavaはPairクラスを提供しないため、独自のクラスを定義する必要があります。

class Pair<A, B> {
  public final A first;
  public final B second;

  public Pair(final A first, final B second) {
    this.first = first;
    this.second = second;
  }

  //
  // Override 'equals', 'hashcode' and 'toString'
  //
}

そして、それを次のように使用します:

List<Pair<String, String>> action = new ArrayList<Pair<String, String>>();

[ここではListを使用しました。これは、インターフェイスにプログラムすることをお勧めするためです。 ]

4
missingfaktor

すでに回答したように、@PéterTörökのように文字列配列のArrayListを作成できます。

    //Declaration of an ArrayList of String Arrays
    ArrayList<String[]> listOfArrayList = new ArrayList<String[]>();

このArrayListに異なる文字列配列を割り当てると、各文字列配列の長さが異なります。

次の例では、4つの異なる文字列の配列が追加され、その長さはさまざまです。

String Array #1: len: 3
String Array #2: len: 1
String Array #3: len: 4
String Array #4: len: 2

デモンストレーションコードは次のとおりです。

import Java.util.ArrayList;

public class TestMultiArray {

    public static void main(String[] args) {
        //Declaration of an ArrayList of String Arrays
        ArrayList<String[]> listOfArrayList = new ArrayList<String[]>();

        //Assignment of 4 different String Arrays with different lengths
        listOfArrayList.add( new String[]{"line1: test String 1","line1: test String 2","line1: test String 3"}  );
        listOfArrayList.add( new String[]{"line2: test String 1"}  );
        listOfArrayList.add( new String[]{"line3: test String 1","line3: test String 2","line3: test String 3", "line3: test String 4"}  );
        listOfArrayList.add( new String[]{"line4: test String 1","line4: test String 2"}  );

        // Printing out the ArrayList Contents of String Arrays
        // '$' is used to indicate the String elements of String Arrays
        for( int i = 0; i < listOfArrayList.size(); i++ ) {
            for( int j = 0; j < listOfArrayList.get(i).length; j++ )
                System.out.printf(" $ " + listOfArrayList.get(i)[j]);

            System.out.println();
        }

    }
}

出力は次のとおりです。

 $ line1: test String 1 $ line1: test String 2 $ line1: test String 3
 $ line2: test String 1
 $ line3: test String 1 $ line3: test String 2 $ line3: test String 3 $ line3: test String 4
 $ line4: test String 1 $ line4: test String 2

また、以下のようにスティングの新しい配列を初期化できることを通知します。

new String[]{ str1, str2, str3,... }; // Assuming str's are String objects

したがって、これは次と同じです。

String[] newStringArray = { str1, str2, str3 }; // Assuming str's are String objects

このデモは、ArrayListオブジェクト、すべての要素が文字列配列の異なるインスタンス化への参照であるため、各文字列配列の長さが同じである必要はなく、大事です。

最後のメモ:質問で使用したものの代わりに、Listインターフェイス内でArrayListを使用することをお勧めします。

以下のようにListインターフェースを使用する方が良いでしょう。

    //Declaration of an ArrayList of String Arrays
    List<String[]> listOfArrayList = new ArrayList<String[]>();
3
ArrayList<String[]> action = new ArrayList<String[]>();

必要ありませんString[2];

3
Koerr

これは非常にうまく機能します。

ArrayList<String[]> a = new ArrayList<String[]>();
    a.add(new String[3]);
    a.get(0)[0] = "Zubair";
    a.get(0)[1] = "Borkala";
    a.get(0)[2] = "Kerala";
System.out.println(a.get(0)[1]);

結果は

Borkala
0
ZBorkala