web-dev-qa-db-ja.com

ArrayListをさまざまな長さの配列を含む2D配列に変換します

ので、私は持っています:

ArrayList<ArrayList<String>> 

別のy個の文字列を含むx個のArrayListsを含む。

Index 0:
  String 1
  String 2
  String 3
Index 1:
  String 4
Index 2:
Index 3:
  String 5
  String 6

Indexは、文字列を含む配列インデックスを指します。

これを次のような2D配列に変換するにはどうすればよいですか?

{{String1, String2, String3},{String4}, {}, {String5, String6}}

どうもありがとうございます。

19
Stefan Dunn
String[][] array = new String[arrayList.size()][];
for (int i = 0; i < arrayList.size(); i++) {
    ArrayList<String> row = arrayList.get(i);
    array[i] = row.toArray(new String[row.size()]);
}

arrayListはあなたのArrayList<ArrayList<String>>(または任意のList<List<String>>、それに応じてforループ内の最初の行を変更します)

28
michele b

Java 8!の世界へようこそ!

この1行のコードを書くのに何が必要かを知るのに、眠ることなく一晩中かかっただけでした。私はそれがどこかにすでにあると確信していますが、それを見つけることができませんでした。だから私は自分の時間と何時間もの研究を共有しています、楽しんでください。すごい!

想定:

ArrayList<ArrayList<String>> mainList = new ArrayList<ArrayList<String>>();
// populate this list here

(または、むしろJava 8:

ArrayList<ArrayList<String>> mainList = new ArrayList();
//Populate

それからあなたが必要とするすべては次のとおりです:

String[][] stringArray = mainList.stream().map(u -> u.toArray(new String[0])).toArray(String[][]::new);

バム! 1行。

私はそれが他のオプションと比較してどれくらい速いかわかりません。しかし、これはそれがどのように機能するかです:

  1. mainList 2D ArrayListのストリームを取得します。このストリームは、LinkedListに接続されたVectorに少し似ていて、子供がいました。そして、その子供は、後になって、いくつかの NZT-48 を飲み込んだ。私は脱線します。 mainList.stream()は、ArrayList<String>要素のストリームを返しています。または、もっとおしゃべりでさえ:mainList.stream()Stream<ArrayList<String>>を返します。

  2. そのストリームで.map関数を呼び出します。この関数は、mapに渡されたパラメーターで指定された新しいタイプに一致するコンテンツを持つ新しいストリームを返します。このmap関数は、ストリーム内の各要素を変換します。組み込みのforeachステートメントがあります。これを達成するために; map関数は、パラメーターとしてラムダ式を取ります。 Lambda式 は、単純なインライン1行関数のようなものです。これには2つのデータ型があります gettin 'Jiggy wit it 。最初は、呼び出されたストリーム内のデータのタイプです(mainList.stream())。次の型は、それがマップされるデータの型で、ラムダ式の右半分にあります:u -> u.toArray(new String[0])。ここで、uは、foreachステートメントを使用するときと同じように選択する識別子です。前半では、u ->のように宣言します。 foreachと同様に、変数uは、ストリームを反復処理するときにストリームの各要素になります。したがって、uは、元のストリームの要素が(isであるため)のデータ型です。 Lambda式の右半分は、各要素u.toArray(new String[0])の処理を示しています。結果を新しいストリームの適切な場所に保存します。この場合、これはString[] ..に変換します。これは、結局、これがString ..の2D配列であるか、コード内のこの点から、String[](文字列配列)の1D配列だからです。 uは最終的にArrayListであることに注意してください。 toArrayオブジェクトからArrayListを呼び出すと、渡される型の新しい配列が作成されます。ここでnew String[0]を渡します。したがって、タイプString[]の新しい配列を作成し、その長さはArrayList uの長さに等しくなります。次に、この新しい文字列の配列にArrayListの内容を入力して返します。 Lambda式を残してmapに戻ります。次に、mapはこれらの文字列配列を収集し、それらを使用して新しいストリームを作成します。関連するタイプString[]を持ち、それを返します。したがって、この場合、mapStream<String[]>を返します。 (まあ、実際にはStream<Object[]>を返します。これは混乱を招き、変換が必要です。以下を参照してください)

  3. したがって、文字列の配列の新しいストリームでtoArrayを呼び出すだけです。ただし、Stream<Object[]>toArrayを呼び出すことは、以前に行ったように、ArrayList<String>で呼び出すこととは少し異なります。ここでは、関数参照を混乱させるものを使用する必要があります。これからタイプを取得します:String[][]::newnew関数のタイプはString[][]です。基本的に、関数はtoArrayと呼ばれるので、常に何らかの[]になります。私たちの場合、内部のデータはさらに別の配列であったため、別の[]を追加するだけです。なぜNZT-48がこれに取り組んでいないのか分かりません。 toArray()へのデフォルトの呼び出しで十分であり、そのストリームとすべてを確認できたはずです。特にStream<String[]>であるストリーム。 mapが実際にStream<Object[]>を返し、Lambda式によって返されるタイプのストリームではない理由を知っている人はいますか?

  4. これで、toArrayストリームからmainListが適切に動作するようになりました。簡単にローカル変数にダンプできます:String[][] stringArray = mainList.stream...

整数の2D ArrayListをプリミティブintの2D配列に変換

今、私はあなたの何人かが出かけていることを知っています。 「これはintでは機能しません!」私の場合もそうでした。ただし、「 Ents 」では機能します。上記を参照してください。ただし、2D int of ArrayListからの2DプリミティブInteger配列(つまりArrayList<ArrayList<Integer>>)が必要な場合。中間の[earth]マッピングを変更する必要があります。 ArrayListにはプリミティブ型を使用できないことに注意してください。したがって、ArrayList<Integer>toArrayを呼び出して、int[]を取得することはできません。マッピングする必要があります...もう一度。

int[][] intArray = mainList.stream().map(  u  ->  u.stream().mapToInt(i->i).toArray()  ).toArray(int[][]::new);

読みやすくするためにスペースを空けようとしました。ただし、同じマッピングプロセス全体をもう一度実行する必要があることがわかります。今回は、単にArrayListのtoArrayを呼び出すことはできませんu;上記の例のように。ここでは、toArrayではなく、StreamArrayListを呼び出しています。何らかの理由で「タイプ」を渡す必要はありません。脳ステロイドを摂取していると思います。したがって、デフォルトのオプションを使用できます。そのNZT-48がヒットし、今回の[実行]タイムが明らかであることがわかります。上記の例でなぜそれができないのか分かりません。ああ、そうです。..ArrayListsは、StreamsのようにNZT-48を取りません。待って...私はここで何を話しているのでしょうか?

Annnyhoow、ストリームはすっごくスマートだから。 Sheldon と同様に、それらに対処するためのまったく新しいプロトコルが必要です。どうやら高度なインテリジェンスが常に扱いやすいとは限りません。したがって、この新しいmapToIntは、よりスマートなStreamを使用できる新しいtoArrayを作成するために必要です。そして、mapToInti->i Lambda式は、int = Integerを許可する暗黙的な自動ボックス化解除を使用した、Integerからintへの単純なボックス化解除です。これは、知性に限界があるかのように、今やるべき愚かな些細なことのように思えます。このすべてを学ぶ冒険の中で:デフォルトの動作を期待していたので、実際にmapToInt(null)を使用しようとしました。議論ではありません!! (シェルドン)それから私は最善を尽くします Husker バレーガールアクセント、「やっぱり、それはismapToIntと呼ばれ、のような、84%の時間( 42 x2)は、i->iを渡すようになります。言うまでもありませんが、少し感じます...ように.. この男 。ダンノ、どうしてそんなにうまくいかないの!

まあ、私は赤目で、半分は妄想で半分は眠っています。私はおそらくいくつかの間違いを犯した。それらを修正して、さらに良い方法があれば教えてください!

PT

25
Pimp Trizkit

toArray()メソッドを使用して、ArrayListを配列に変換できます。 ArrayList内にArrayListがあるため、各要素を反復処理してこのメ​​ソッドを適用する必要があります。

このようなもの:-

_ArrayList<ArrayList<String>> mainList = new ArrayList<ArrayList<String>>();
// populate this list here
//more code

// convert to an array of ArrayLists
ArrayList<String[]> tempList = new ArrayList<String[]>();
for (ArrayList<String> stringList : mainList){
    tempList.add((String[])stringList.toArray());
}

//Convert to array of arrays - 2D array
String [][]list = (String[][])tempList.toArray();
_

toArray()の詳細を確認できます こちら

5
vaisakh
ArrayList<ArrayList<String>> list= new ArrayList<ArrayList<String>>();
          ArrayList<String> a = new ArrayList<String>();
          ArrayList<String> b = new ArrayList<String>();
          a.add("Hello");
          b.add("Hell");
          list.add(a);
          list.add(b);
          Object[][] array = new Object[list.size()][];
          Iterator<ArrayList<String>> iterator = list.iterator();
          int i = 0;
          while(iterator.hasNext()){
              array[i] = iterator.next().toArray();
          }

以下のスニペットを使用して、Object []をString []に変換できます

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
1
Chandra Sekhar

例えば:

public String[][] toArray(List<List<String>> list) {
    String[][] r = new String[list.size()][];
    int i = 0;
    for (List<String> next : list) {
       r[i++] = next.toArray(new String[next.size()]);
    }
    return r;
}
1
Eugene Retunsky

この完全なミニプログラムコードは、この質問に非常に自明な方法で答えています。貼り付けて実行するだけです。

import Java.util.ArrayList;
import Java.util.List;

public class ListTo2Darray {

    public String[][] toArray(List<List<?>> list) {
    String[][] r = new String[list.size()][];
    int i = 0;
    for (List<?> next : list) {
       r[i++] = next.toArray(new String[next.size()]);
    }
    return r;
}

    public static void main(String[]arg){
        String[][] sham;

        List<List<?>> mList = new ArrayList();

        List<String> a= new ArrayList();
        List<String> b= new ArrayList();
        a.add("a");  a.add("a");
        b.add("b");  b.add("b");
        mList.add(a); mList.add(b); 

        ListTo2Darray mt= new ListTo2Darray();
        sham=   mt.toArray(mList);

        System.out.println(sham[0][0]);
        System.out.println(sham[0][1]);
        System.out.println(sham[1][0]);
        System.out.println(sham[1][1]);
    }

}
0
Harjit Singh