От Arraylist к массиву - PullRequest
       5

От Arraylist к массиву

104 голосов
/ 01 ноября 2011

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

1236
1233
4566
4568
....

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

спасибо

Ответы [ 9 ]

208 голосов
/ 01 ноября 2011

Да безопасно конвертировать 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);

1012 * выходы *

bar.length = 5
75 голосов
/ 01 ноября 2011

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

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

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

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

Но он менее эффективен: массив строк создается дважды: первый раз ноль-длинный массив создается, затем массив реального размера создается, заполняется и возвращается.Итак, если вы знаете необходимый размер (от list.size()), вам следует создать массив, достаточно большой для размещения всех элементов.В этом случае он не перераспределяется.

6 голосов
/ 01 ноября 2011
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

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

4 голосов
/ 01 ноября 2011

при условии, что v является ArrayList:

String[] x = (String[]) v.toArray(new String[0]);
2 голосов
/ 18 апреля 2018

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

1 голос
/ 01 ноября 2011
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

Это зависит от того, чего вы хотите достичь, если вам понадобится манипулировать массивом позже, это будет стоить больше усилий, чем сохранение строки в ArrayList. У вас также есть произвольный доступ с ArrayList по list.get( index );

0 голосов
/ 29 июля 2018
String content = new String(Files.readAllBytes(Paths.get("C://temp//temp.txt")),
    StandardCharsets.UTF_8);

List<String> wordsList = Arrays.asList(content.split(System.getProperty("line.separator")));
Stream<String> wordsStream = Stream.of(content.split(System.getProperty("line.separator"))); 

// The resulting arrays
String[] wordsArray0 = wordsList.stream().toArray(String[]::new);
String[] wordsArray1 = wordsStream.toArray(String[]::new);
0 голосов
/ 08 февраля 2016

Один из подходов заключается в добавлении Second for Loop, где печать выполняется внутри первого цикла 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 голосов
/ 17 ноября 2015

Интерфейс 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 / как получить массив из архива.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...