Dizi Listesinden Diziye


111

ArrayList'ten Array'e dönüştürmenin güvenli / tavsiye edilebilir olup olmadığını bilmek istiyorum. Her satırda bir dize olan bir metin dosyam var:

1236
1233
4566
4568
....

Bunları dizi listesine okumak ve ardından onu Array'e dönüştürmek istiyorum. Bunu yapmak tavsiye edilir / yasal mı?

Teşekkürler


8
Sen can , ama bize bunun iyi bir fikir olup olmadığını söylemek neredeyse yeterli bilgi vermediniz.
Jon Skeet

6
Dizi Listeleri iyidir. Bir Array'e dönüştürmek için görebilmemin tek nedeni, onu gerektiren bir yöntemi çağırmanız gerekmesidir.
mike jones

Yanıtlar:


214

Evet , bir'yi ArrayListbirArray . İyi bir fikir olup olmadığı, kullanım amacınıza bağlıdır. Sağlayan operasyonlara ihtiyacınız var ArrayListmı? Eğer öyleyse, bir ArrayList. Başka bir yere çevirin!

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

çıktılar

bar.length = 5

Ya ArrayList boşsa?
ThanosFisherman

48
O zaman boş.
IMustBeSomeone

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
Aaron Franke

75

Bu en iyi yoldur (IMHO).

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

Bu kod aynı zamanda çalışır:

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

Ancak daha az etkilidir: dize dizisi iki kez oluşturulur: ilk kez sıfır uzunluklu dizi oluşturulur, ardından gerçek boyutlu dizi oluşturulur, doldurulur ve döndürülür. Öyleyse, gerekli boyutu (kimden list.size()) bildiğinize göre, tüm öğeleri yerleştirmek için yeterince büyük bir dizi oluşturmalısınız. Bu durumda yeniden tahsis edilmez.


4
new String[0]ve arasındaki farkın iyi açıklamasınew String[size]
gamliela

4
new String[0]aslında daha etkilidir. shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef

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

Bunun "iyi bir fikir" olup olmadığı, gerçekten kullanım durumunuza bağlı olacaktır.


teşekkürler, sadece merak ediyorum: dizi boyutunu bildirmeme gerek yok mu?
Eddy Freeman

JavaDocs sizin arkadaşınızdır. İletilen dizi çok küçükse yeni bir dizi döndürülür. Yöntemin bağımsız değişken almayan diğer sürümü bir dizi döndürürObject
Brian Roach

3

v'nin bir ArrayList olduğunu varsayarsak:

String[] x = (String[]) v.toArray(new String[0]);

1

Bir koleksiyonu bir diziye dönüştürmek için iki stil vardır: önceden boyutlandırılmış bir dizi (benzer c.toArray(new String[c.size()])) kullanmak veya boş bir dizi (benzer c.toArray(new String[0])) kullanmak. Daha eski Java sürümlerinde önceden boyutlandırılmış dizi kullanılması öneriliyordu, çünkü uygun boyutta bir dizi oluşturmak için gerekli olan yansıma çağrısı oldukça yavaştı. Bununla birlikte, OpenJDK 6'nın geç güncellemelerinden bu yana, bu çağrı, boş dizi versiyonunun performansını önceden boyutlandırılmış versiyonla aynı ve bazen daha iyi hale getirerek içselleştirildi. Ayrıca önceden boyutlandırılmış diziyi iletmek, eşzamanlı veya eşzamanlı bir koleksiyon için tehlikelidir, çünkü boyut ve toArray çağrısı arasında bir veri yarışı mümkündür, bu da koleksiyonun işlem sırasında eşzamanlı olarak küçültülmesi durumunda dizinin sonunda fazladan boş değerlere neden olabilir. Tek tip stili takip edebilirsiniz:ya boş bir dizi kullanarak (modern Java'da önerilir) ya da önceden boyutlandırılmış bir dizi kullanarak (eski Java sürümlerinde veya HotSpot tabanlı olmayan JVM'lerde daha hızlı olabilir) .


1

Bu, daha yeni Java için önerilen kullanımdır (> Java 6)

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

Daha eski Java sürümlerinde önceden boyutlandırılmış dizi kullanılması öneriliyordu, çünkü uygun boyutta bir dizi oluşturmak için gerekli olan yansıma çağrısı oldukça yavaştı. Bununla birlikte, OpenJDK 6'nın geç güncellemelerinden bu yana, bu çağrı, boş dizi versiyonunun performansını önceden boyutlandırılmış versiyonla aynı ve bazen daha iyi hale getirerek içselleştirildi. Ayrıca boyut ve toArray çağrısı arasında bir veri yarışı olabileceğinden, önceden boyutlandırılmış diziyi iletmek, işlem sırasında eşzamanlı olarak küçültülmüşse, dizinin sonunda fazladan boş değerlere neden olabileceğinden, eşzamanlı veya senkronize edilmiş bir koleksiyon için tehlikelidir. Bu inceleme, tek tip stilin izlenmesini sağlar: boş bir dizi (modern Java'da önerilir) veya önceden boyutlandırılmış bir dizi (eski Java sürümlerinde veya HotSpot tabanlı olmayan JVM'lerde daha hızlı olabilir) kullanarak.


0

Koleksiyon arabirimi, yeni bir koleksiyonu diziye dönüştürmek için toArray () yöntemini içerir. Bu yöntemin iki şekli vardır. Bağımsız değişken içermeyen sürüm, koleksiyonun öğelerini bir Object dizisinde döndürür: public Object [] toArray (). Döndürülen dizi başka herhangi bir veri türüne dönüştürülemez. Bu en basit versiyondur. İkinci sürüm, döndürmek istediğiniz dizinin veri türünü iletmenizi gerektirir: 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);  
           }  
      }  

referans için bu bağlantıya bakın http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html


0

Bir yaklaşım, yazdırmanın birinci for döngüsünün içinde yapıldığı yere Döngü için İkinciyi eklemek olacaktır. Bunun gibi:

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();

Neye ulaşmak istediğinize bağlıdır, eğer diziyi daha sonra değiştirmeniz gerekirse, dizeyi ArrayList'te tutmaktan daha fazla çaba harcayacaktır. Ayrıca bir ArrayList ile rastgele erişiminiz var.list.get( index );

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.