回答:
List<String> list = ..;
String[] array = list.toArray(new String[0]);
例えば:
List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);
toArray()
任意の引数リターンを介さず方法Object[]
。したがって、配列を引数として渡す必要があります。これには、リストからのデータが入力されて返されます。空の配列を渡すこともできますが、必要なサイズの配列を渡すこともできます。
重要な更新:元々は上記のコードが使用されていましたnew String[list.size()]
。ただし、このブログ投稿では、JVMの最適化により、使用new String[0]
が改善されていることが明らかになりました。
Class
オブジェクトが必要です。これは、ジェネリックタイプから派生させることは完全に不可能のようです。私が言ったように、これの理由は全体の構造が偽物だからです。すべて内部的にObjectとして保存されます。
Java 8の代替:
String[] strings = list.stream().toArray(String[]::new);
Java 11以降:
String[] strings = list.toArray(String[]::new);
toArray
はStream
オブジェクトでのみ使用できます。このコンパイルエラーは、a Collectors
を使用してストリームを減らしてから適用しようとすると発生することがありますtoArray
。
次のtoArray()
方法を使用できますList
。
ArrayList<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
String[] array = list.toArray(new String[list.size()]);
または、手動で要素を配列に追加できます。
ArrayList<String> list = new ArrayList<String>();
list.add("apple");
list.add("banana");
String[] array = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
array[i] = list.get(i);
}
お役に立てれば!
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray = Arrays.copyOf(objectList,objectList.length,String[].class);
copyOfを使用して、ArrayListを配列に変換することもできます。
Java-11以降では、代わりにAPI Collection.toArray(IntFunction<T[]> generator)
を使用して同じことを達成できます。
List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray
すべてList<Type>
を変換するジェネリックソリューションString []
:
public static <T> String[] listToArray(List<T> list) {
String [] array = new String[list.size()];
for (int i = 0; i < array.length; i++)
array[i] = list.get(i).toString();
return array;
}
注override toString()
メソッドを実行する必要があります。
class Car {
private String name;
public Car(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
array[i++] = s;
}
ユーザーが関数を必要とするデータの追加操作が必要な場合、このアプローチは完全ではありません(要素のクラスを2番目のパラメーターとして渡す必要があるため)。
import java.util.ArrayList; import java.lang.reflect.Array;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList<>();
al.add(1);
al.add(2);
Integer[] arr = convert(al, Integer.class);
for (int i=0; i<arr.length; i++)
System.out.println(arr[i]);
}
public static <T> T[] convert(ArrayList<T> al, Class clazz) {
return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
}
}
アプリケーションがすでにApache Commons libを使用している場合は、受け入れられる回答を少し変更して、毎回新しい空の配列を作成しないようにすることができます。
List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);
には、いくつかの事前割り当てされArrayUtils
たさまざまなタイプの空の配列があります。
また、JVMをだまして空の配列を次のように作成することもできます。
String[] array = list.toArray(ArrayUtils.toArray());
// or if using static import
String[] array = list.toArray(toArray());
しかし、この方法には利点はありません。IMOは好みの問題です。
を使用Iterator<String>
して、の要素を反復できますArrayList<String>
。
ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
array[i] = iterator.next();
}
これでString[]
、ループを使用して要素を取得できます。
.toString()
しない2. 明示的なキャストが不要な場所を使用する、3.インクリメントもしないi
、4. 4.をにwhile
置き換えるほうがよいfor
。推奨コード:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Java 11では、Collection.toArray(generator)
メソッドを使用できます。次のコードは、文字列の新しい配列を作成します。
List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String [] strArry= list.stream().toArray(size -> new String[size]);
コメントごとに、変換の仕組みを説明する段落を追加しました。まず、Listが文字列ストリームに変換されます。次に、Stream.toArrayを使用して、ストリーム内の要素を配列に変換します。上記の最後のステートメントの「size-> new String [size]」は、実際には、StringストリームのサイズでString配列を割り当てるIntFunction関数です。ステートメントはと同じです
IntFunction<String []> allocateFunc = size -> {
return new String[size];
};
String [] strArry= list.stream().toArray(allocateFunc);
このメソッドを使用して、リストを文字列配列に変換できます。
Object[] stringlist=list.toArray();
完全な例:
ArrayList<String> list=new ArrayList<>();
list.add("Abc");
list.add("xyz");
Object[] stringlist=list.toArray();
for(int i = 0; i < stringlist.length ; i++)
{
Log.wtf("list data:",(String)stringlist[i]);
}
toArray(T[])
Stream.toArray