29

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

ArrayList<ArrayList<String>> 

これには、別のy個の文字列を含むx個のArrayListが含まれています..デモンストレーションするには:

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

どうもありがとう。

4

7 に答える 7

51

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

このおかしなコード行を書くのに何が必要かを学ぶのに、一晩中眠らずに過ごしただけです。すでにどこかにあると思いますが、見つけられませんでした。だから私は何時間もの研究を共有しています。楽しんでください。ウット!

仮定:

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. mainList2D ArrayListのストリームを取得します。このストリームは、LinkedList に接続された Vector に少し似ており、子供が生まれました。そして、その子供は、後年、NZT-48を服用しました。余談です。要素mainList.stream()のストリームを返しています。ArrayList<String>または、さらにマニアックに言えば、 mainList.stream()a を返しますStream<ArrayList<String>>

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

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

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

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

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

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

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

ストリームはとてもスマートだからです。Sheldonのように、それらに対処するにはまったく新しいプロトコルが必要です。どうやら高度な知性は、必ずしも対処が容易であるとは限りません。したがって、この newは、よりスマートに使用できるmapToIntnew を作成するために必要です。また、 のLambda 式はtoの単純なボックス化解除であり、を許可する暗黙的な自動ボックス化解除を使用しています。まるで知性には限界があるかのように、これは今やばかげた些細なことのように思えます。このすべてを学ぶ冒険の中で、デフォルトの動作を期待していたので、実際に使用しようとしました。議論ではありません!! (シェルドン)それから私は最善のハスカーで言いますStreamtoArrayi->imapToIntIntegerintint = IntegermapToInt(null)谷の女の子のアクセント、「結局のところ、それと呼ばれます。84%mapToIntの確率で ( 42 x 2)、通り過ぎるi->i、みんな、そう、オムゴード!」言うまでもなく、私はちょっと……この男……みたいな気がする。私は知りません、なぜそれがそのように機能しないのですか。

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

PT

于 2015-12-04T20:38:14.977 に答える
44
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()]);
}

wherearrayListは your ArrayList<ArrayList<String>>(または any 、それに応じてループList<List<String>>内の最初の行を変更します)for

于 2012-04-06T12:16:11.230 に答える
6

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() こちらを参照してください。

于 2012-04-06T12:07:24.583 に答える
2

例えば:

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;
}
于 2012-04-06T12:17:21.557 に答える
1
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);
于 2012-04-06T12:15:17.563 に答える
0

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

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

}
于 2016-06-27T07:16:36.420 に答える
0
queries=[[1,5,3],[4,8,7],[6,9,1]]
h=queries.size();

        for(i=0;i<h;i++){
            for(j=0;j<3;j++){
                y[i][j]= ( ( queries.get(i) ).get(j) );
            }  
        }

このステートメントの y[i][j] で、最初に query.get(i) がリストの最初のブロックを選択します。つまり、i=0 で [1,5,3] を選択し、次にj=0 は [1,5,3] から 1 を選択します。

ループの説明: y[][]=[ 1 5 3 4 8 7 6 9 1 ]

注: クエリを特定の配列に置き換えます。

それが機能するかどうか、または問題を解決する別の方法を提供する必要があるかどうかを教えてください

于 2021-06-10T18:27:35.633 に答える