От Arraylist к массиву


111

Я хочу знать, безопасно / целесообразно ли преобразовывать из ArrayList в Array? У меня есть текстовый файл с каждой строкой строки:

1236
1233
4566
4568
....

Я хочу прочитать их в списке массивов, а затем преобразовать его в массив. Целесообразно / законно ли это делать?

Спасибо


8
Вы можете , но вы не предоставили нам достаточно информации, чтобы сказать вам, хорошая это идея или нет.
Джон Скит

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

48
Тогда пусто.
IMustBeSomeone

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
Аарон Франке

75

Это лучший способ (ИМХО).

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

Этот код также работает:

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

Но он менее эффективен: массив строк создается дважды: сначала создается массив нулевой длины, затем создается, заполняется и возвращается массив реального размера. Итак, если вы знаете необходимый размер (от 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]);

Действительно ли это «хорошая идея», будет зависеть от вашего варианта использования.


спасибо, просто интересно узнать: мне не нужно объявлять размер массива?
Эдди Фриман

JavaDocs - ваш друг. Если переданный массив слишком мал, возвращается новый массив. Другая версия метода, который не принимает аргументов, возвращает массивObject
Брайан Роуч


1

Есть два стиля для преобразования коллекции в массив: либо с использованием массива предварительно заданного размера (например c.toArray(new String[c.size()])), либо с использованием пустого массива (например c.toArray(new String[0])). В более старых версиях Java рекомендуется использовать массив с предварительно заданным размером, так как вызов отражения, необходимый для создания массива надлежащего размера, был довольно медленным. Однако после поздних обновлений OpenJDK 6 этот вызов был встроен, что сделало производительность версии с пустым массивом такой же, а иногда и лучше, по сравнению с версией с предварительно заданным размером. Также передача предварительно заданного массива опасна для параллельной или синхронизированной коллекции, поскольку возможна гонка данных между размером и вызовом toArray, что может привести к лишним значениям NULL в конце массива, если коллекция одновременно сокращалась во время операции. Вы можете следовать единому стилю:либо с использованием пустого массива (что рекомендуется в современной Java), либо с использованием массива предварительно заданного размера (что может быть быстрее в более старых версиях Java или JVM, не основанных на HotSpot) .


1

Это рекомендованное использование для более новой версии Java (> Java 6).

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

В более старых версиях Java рекомендуется использовать массив с предварительно заданным размером, так как вызов отражения, необходимый для создания массива надлежащего размера, был довольно медленным. Однако после поздних обновлений OpenJDK 6 этот вызов был встроен, что сделало производительность версии с пустым массивом такой же, а иногда и лучше, по сравнению с версией с предварительно заданным размером. Также передача предварительно заданного массива опасна для параллельной или синхронизированной коллекции, поскольку возможна гонка данных между размером и вызовом toArray, что может привести к лишним значениям NULL в конце массива, если коллекция одновременно сокращалась во время операции. Эта проверка позволяет следовать единому стилю: либо использовать пустой массив (что рекомендуется в современной Java), либо использовать массив предварительно заданного размера (что может быть быстрее в старых версиях Java или JVM, не основанных на HotSpot).


0

Интерфейс Collection включает метод toArray () для преобразования новой коллекции в массив. Есть две формы этого метода. Версия без аргументов вернет элементы коллекции в массиве Object: public Object [] toArray (). Возвращенный массив не может быть приведен к любому другому типу данных. Это самый простой вариант. Вторая версия требует от вас передать тип данных массива, который вы хотите вернуть: 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

Один из подходов - добавить второй цикл for, где печать выполняется внутри первого цикла 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 );

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.