ので、私は持っています:
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}}
どうもありがとうございます。
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
ループ内の最初の行を変更します)
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行。
私はそれが他のオプションと比較してどれくらい速いかわかりません。しかし、これはそれがどのように機能するかです:
mainList
2D ArrayListのストリームを取得します。このストリームは、LinkedListに接続されたVectorに少し似ていて、子供がいました。そして、その子供は、後になって、いくつかの NZT-48 を飲み込んだ。私は脱線します。 mainList.stream()
は、ArrayList<String>
要素のストリームを返しています。または、もっとおしゃべりでさえ:mainList.stream()
はStream<ArrayList<String>>
を返します。
そのストリームで.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[]
を持ち、それを返します。したがって、この場合、map
はStream<String[]>
を返します。 (まあ、実際にはStream<Object[]>
を返します。これは混乱を招き、変換が必要です。以下を参照してください)
したがって、文字列の配列の新しいストリームでtoArray
を呼び出すだけです。ただし、Stream<Object[]>
でtoArray
を呼び出すことは、以前に行ったように、ArrayList<String>
で呼び出すこととは少し異なります。ここでは、関数参照を混乱させるものを使用する必要があります。これからタイプを取得します:String[][]::new
。 new
関数のタイプはString[][]
です。基本的に、関数はtoArrayと呼ばれるので、常に何らかの[]
になります。私たちの場合、内部のデータはさらに別の配列であったため、別の[]
を追加するだけです。なぜNZT-48がこれに取り組んでいないのか分かりません。 toArray()
へのデフォルトの呼び出しで十分であり、そのストリームとすべてを確認できたはずです。特にStream<String[]>
であるストリーム。 map
が実際にStream<Object[]>
を返し、Lambda式によって返されるタイプのストリームではない理由を知っている人はいますか?
これで、toArray
ストリームからmainList
が適切に動作するようになりました。簡単にローカル変数にダンプできます:String[][] stringArray = mainList.stream...
今、私はあなたの何人かが出かけていることを知っています。 「これは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
ではなく、Stream
でArrayList
を呼び出しています。何らかの理由で「タイプ」を渡す必要はありません。脳ステロイドを摂取していると思います。したがって、デフォルトのオプションを使用できます。そのNZT-48がヒットし、今回の[実行]タイムが明らかであることがわかります。上記の例でなぜそれができないのか分かりません。ああ、そうです。..ArrayListsは、StreamsのようにNZT-48を取りません。待って...私はここで何を話しているのでしょうか?
Annnyhoow、ストリームはすっごくスマートだから。 Sheldon と同様に、それらに対処するためのまったく新しいプロトコルが必要です。どうやら高度なインテリジェンスが常に扱いやすいとは限りません。したがって、この新しいmapToInt
は、よりスマートなStream
を使用できる新しいtoArray
を作成するために必要です。そして、mapToInt
のi->i
Lambda式は、int = Integer
を許可する暗黙的な自動ボックス化解除を使用した、Integer
からint
への単純なボックス化解除です。これは、知性に限界があるかのように、今やるべき愚かな些細なことのように思えます。このすべてを学ぶ冒険の中で:デフォルトの動作を期待していたので、実際にmapToInt(null)
を使用しようとしました。議論ではありません!! (咳シェルドン咳)それから私は最善を尽くします Husker バレーガールアクセント、「やっぱり、それはismapToInt
と呼ばれ、のような、84%の時間( 42 x2)は、i->i
を渡すようになります。言うまでもありませんが、少し感じます...ように.. この男 。ダンノ、どうしてそんなにうまくいかないの!
まあ、私は赤目で、半分は妄想で半分は眠っています。私はおそらくいくつかの間違いを犯した。それらを修正して、さらに良い方法があれば教えてください!
PT
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()
の詳細を確認できます こちら
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);
例えば:
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;
}
この完全なミニプログラムコードは、この質問に非常に自明な方法で答えています。貼り付けて実行するだけです。
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]);
}
}