От 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
ObscureRobot
источник
Что делать, если 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()), вы должны создать массив, достаточно большой для размещения всех элементов. В этом случае он не перераспределяется.

AlexR
источник
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
Брайан Роуч
3

предполагая, что v является ArrayList:

String[] x = (String[]) v.toArray(new String[0]);
Эрхан Багдемир
источник
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).

majurageerthan
источник
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 );

укладчик
источник