回答:
はい、ArrayList
をに変換しても安全Array
です。それが良いアイデアかどうかは、あなたの使用目的に依存します。ArrayList
提供する操作が必要ですか?その場合は、そのままにしArrayList
ます。それ以外の場合は変換してください!
ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(1);
foo.add(1);
foo.add(2);
foo.add(3);
foo.add(5);
Integer[] bar = foo.toArray(new Integer[foo.size()]);
System.out.println("bar.length = " + bar.length);
出力
bar.length = 5
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
これが最良の方法です(私見)。
List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);
このコードも機能します:
String[] myArray = myArrayList.toArray(new String[0]);
しかし、あまり効果的ではありません。文字列配列が2回作成されます。最初に長さゼロの配列が作成され、次に実サイズの配列が作成され、入力され、返されます。したがって、必要なサイズ(からlist.size()
)がわかっている場合は、すべての要素を配置するのに十分な大きさの配列を作成する必要があります。この場合、再割り当てされません。
new String[0]
とnew String[size]
new String[0]
実際にはより効率的です。shipilev.net/blog/2016/arrays-wisdom-ancients
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);
それが「良いアイデア」であるかどうかは、実際にはユースケースに依存します。
Object
vがArrayListであると仮定します。
String[] x = (String[]) v.toArray(new String[0]);
コレクションを配列に変換するには、事前にサイズ設定された配列(などc.toArray(new String[c.size()])
)または空の配列(などc.toArray(new String[0])
)を使用する2つのスタイルがあります。適切なサイズの配列を作成するために必要なリフレクションの呼び出しが非常に遅いため、以前のサイズの配列を使用する古いJavaバージョンでは推奨されていました。ただし最新のアップデート以降 OpenJDK 6のこの呼び出しが組み込まれたため、空の配列バージョンのパフォーマンスは、プリサイズバージョンと比較して同じになり、時にはさらに向上しました。また、コレクションが操作中に同時に縮小された場合、サイズとtoArray呼び出しの間でデータの競合が発生し、配列の最後に余分なnullが発生する可能性があるため、プリサイズの配列を渡すことは、同時または同期コレクションでは危険です。あなたは均一なスタイルに従うことができます:空の配列(最新のJavaで推奨)を使用するか、事前にサイズ設定された配列(古いJavaバージョンまたは非HotSpotベースのJVMでは高速になる可能性があります)を使用します。
これは、新しいJava(> Java 6)の推奨される使用法です
String[] myArray = myArrayList.toArray(new String[0]);
適切なサイズの配列を作成するために必要なリフレクションの呼び出しが非常に遅いため、以前のサイズの配列を使用する古いJavaバージョンでは推奨されていました。ただし、OpenJDK 6の最新のアップデート以降、この呼び出しが組み込まれたため、空の配列バージョンのパフォーマンスは、プリサイズバージョンと比較して同じになり、場合によってはさらに向上しました。また、コレクションが操作中に同時に縮小された場合、サイズとtoArray呼び出しの間でデータの競合が発生し、配列の最後に余分なnullが発生する可能性があるため、プリサイズの配列を渡すことは、同時または同期コレクションでは危険です。この検査により、空の配列(最新のJavaで推奨)を使用するか、事前にサイズ設定された配列(古いJavaバージョンまたは非HotSpotベースのJVMでは高速になる可能性があります)を使用して、統一されたスタイルに従うことができます。
Collectionインターフェースには、新しいコレクションを配列に変換するtoArray()メソッドが含まれています。このメソッドには2つの形式があります。引数なしのバージョンは、コレクションの要素をオブジェクト配列で返します:public Object [] toArray()。返された配列は、他のデータ型にキャストできません。これは最も単純なバージョンです。2番目のバージョンでは、返したい配列のデータ型を渡す必要があります:public Object [] toArray(Object type [])。
public static void main(String[] args) {
List<String> l=new ArrayList<String>();
l.add("A");
l.add("B");
l.add("C");
Object arr[]=l.toArray();
for(Object a:arr)
{
String str=(String)a;
System.out.println(str);
}
}
参考のために、このリンクを参照してくださいhttp://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html
1つのアプローチは、印刷が最初のforループ内で実行される2番目のforループを追加することです。このような:
static String[] SENTENCE;
public static void main(String []args) throws Exception{
Scanner sentence = new Scanner(new File("assets/blah.txt"));
ArrayList<String> sentenceList = new ArrayList<String>();
while (sentence.hasNextLine())
{
sentenceList.add(sentence.nextLine());
}
sentence.close();
String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]);
// System.out.println(sentenceArray.length);
for (int r=0;r<sentenceArray.length;r++)
{
SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array
for (int i=0;i<SENTENCE.length;i++)
{
System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]);
}
}
}