Від Arraylist до Array


111

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

1236
1233
4566
4568
....

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

Дякую


8
Ви можете , але ви не дали нам майже достатньо інформації, щоб сказати вам, чи це гарна ідея чи ні.
Джон Скіт

6
ArrayLists's нормально. Єдина причина, яку я бачу при перетворенні на масив - це якщо вам потрібно викликати метод, який цього вимагає.
Майк Джонс

Відповіді:


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, що може призвести до додаткових нулів в кінці масиву, якщо колекція одночасно скоротилася під час операції. Ви можете дотримуватися єдиного стилю:або з використанням порожнього масиву (який рекомендується в сучасній Java), або з використанням масиву попереднього розміру (який може бути швидшим у старих версіях Java або JVM на основі не HotSpot) .


1

Це рекомендоване використання для новішої Java (> Java 6)

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

У старіших версіях Java рекомендується використовувати масив попереднього розміру, оскільки дзвінок відображення, необхідний для створення масиву належного розміру, був досить повільним. Однак з пізніми оновленнями OpenJDK 6 цей виклик був інтенсифікований, що робить продуктивність порожньої версії масиву такою ж, а іноді навіть кращою, порівняно з попередньо розмірною версією. Також передача попередньо розмірного масиву небезпечна для одночасного або синхронізованого збору, оскільки можлива перегонка даних між розміром і викликом toArray, що може призвести до додаткових нулів в кінці масиву, якщо колекція одночасно скоротилася під час операції. Цей огляд дозволяє дотримуватися єдиного стилю: або з використанням порожнього масиву (який рекомендується в сучасній Java), або з використанням масиву попереднього розміру (який може бути швидшим у старих версіях Java або JVM на основі не HotSpot).


0

Інтерфейс колекції включає метод toArray () для перетворення нової колекції в масив. Існує дві форми цього методу. Версія без аргументів повертає елементи колекції в масив Object: public Object [] доArray (). Повернутий масив не може передаватися іншому типу даних. Це найпростіша версія. Друга версія вимагає передати тип даних масиву, який ви хочете повернути: public Object [] toArray (Тип об’єкта []).

 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

Одним із підходів було б додати Другий для циклу, де друк проводиться всередині першого для циклу. Подобається це:

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.