ArraylistからArrayへ


111

ArrayListからArrayに変換することが安全かどうかを知りたいのですが?各行に文字列を含むテキストファイルがあります。

1236
1233
4566
4568
....

それらを配列リストに読み込みたいので、それを配列に変換します。それを行うことは賢明/合法ですか?

ありがとう


8
できます、それが良いアイデアであるかどうかを伝えるのに十分な情報を提供していません。
Jon Skeet、2011年

6
ArrayListsは問題ありません。配列に変換する理由は、それを必要とするメソッドを呼び出す必要があるかどうかだけです。
マイクジョーンズ

回答:


214

はい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

ArrayListが空の場合はどうなりますか?
ThanosFisherman 2015

48
その後、それは空です。
IMustBeSomeone 2016年

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
アーロンフランケ2018

75

これが最良の方法です(私見)。

List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);

このコードも機能します:

String[] myArray = myArrayList.toArray(new String[0]);

しかし、あまり効果的ではありません。文字列配列が2回作成されます。最初に長さゼロの配列が作成され、次に実サイズの配列が作成され、入力され、返されます。したがって、必要なサイズ(からlist.size())がわかっている場合は、すべての要素を配置するのに十分な大きさの配列を作成する必要があります。この場合、再割り当てされません。


4
違いの良い説明new String[0]new String[size]
gamliela

4
new String[0]実際にはより効率的です。shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef

5
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

それが「良いアイデア」であるかどうかは、実際にはユースケースに依存します。


ありがとう、知りたいだけです:配列サイズを宣言する必要はありませんか?
Eddy Freeman

JavaDocsはあなたの友達です。渡される配列が小さすぎる場合は、新しい配列が返されます。引数を取らないメソッドのもう1つのバージョンは、配列を返しますObject
Brian Roach


1

コレクションを配列に変換するには、事前にサイズ設定された配列(などc.toArray(new String[c.size()]))または空の配列(などc.toArray(new String[0]))を使用する2つのスタイルがあります。適切なサイズの配列を作成するために必要なリフレクションの呼び出しが非常に遅いため、以前のサイズの配列を使用する古いJavaバージョンでは推奨されていました。ただし最新のアップデート以降 OpenJDK 6のこの呼び出しが組み込まれたため、空の配列バージョンのパフォーマンスは、プリサイズバージョンと比較して同じになり、時にはさらに向上しました。また、コレクションが操作中に同時に縮小された場合、サイズとtoArray呼び出しの間でデータの競合が発生し、配列の最後に余分なnullが発生する可能性があるため、プリサイズの配列を渡すことは、同時または同期コレクションでは危険です。あなたは均一なスタイルに従うことができます:空の配列(最新のJavaで推奨)を使用するか、事前にサイズ設定された配列(古いJavaバージョンまたは非HotSpotベースのJVMでは高速になる可能性があります)を使用します


1

これは、新しいJava(> Java 6)の推奨される使用法です

String[] myArray = myArrayList.toArray(new String[0]);

適切なサイズの配列を作成するために必要なリフレクションの呼び出しが非常に遅いため、以前のサイズの配列を使用する古いJavaバージョンでは推奨されていました。ただし、OpenJDK 6の最新のアップデート以降、この呼び出しが組み込まれたため、空の配列バージョンのパフォーマンスは、プリサイズバージョンと比較して同じになり、場合によってはさらに向上しました。また、コレクションが操作中に同時に縮小された場合、サイズとtoArray呼び出しの間でデータの競合が発生し、配列の最後に余分なnullが発生する可能性があるため、プリサイズの配列を渡すことは、同時または同期コレクションでは危険です。この検査により、空の配列(最新のJavaで推奨)を使用するか、事前にサイズ設定された配列(古いJavaバージョンまたは非HotSpotベースのJVMでは高速になる可能性があります)を使用して、統一されたスタイルに従うことができます。


0

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


0

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

}

0
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

後で配列を操作する必要がある場合に達成したいことによって異なりますが、ArrayListに文字列を保持するよりも多くの労力がかかります。ArrayListを使用してランダムにアクセスすることもできますlist.get( index );

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.