web-dev-qa-db-fra.com

D'Arraylist à Array

Je veux savoir s'il est sûr/conseillé de convertir ArrayList en Array? J'ai un fichier texte avec chaque ligne une chaîne:

1236
1233
4566
4568
....

Je veux les lire dans la liste de tableau et ensuite je le convertis en tableau. Est-il conseillé/légal de faire cela?

merci

104
Eddy Freeman

Oui il est prudent de convertir un ArrayList en un Array . Que ce soit une bonne idée dépend de l'utilisation que vous en faites. Avez-vous besoin des opérations que ArrayList fournit? Si tel est le cas, conservez-le ArrayList. Sinon, convertissez-vous!

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

les sorties

bar.length = 5
208
ObscureRobot

C'est la meilleure façon (IMHO).

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

Ce code fonctionne aussi:

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

Mais c'est moins efficace: le tableau de chaînes est créé deux fois: la première fois, un tableau de longueur nulle est créé, puis le tableau de taille réelle est créé, rempli et renvoyé. Donc, si vous connaissez la taille requise (de list.size()), vous devez créer un tableau assez grand pour mettre tous les éléments. Dans ce cas, il n'est pas réaffecté.

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

Que ce soit une "bonne idée" dépendrait vraiment de votre cas d'utilisation.

6
Brian Roach

en supposant que v est une ArrayList:

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

Il existe deux styles pour convertir une collection en tableau: soit en utilisant un tableau pré-dimensionné (comme c.toArray(new String[c.size()])), soit en utilisant un tableau vide (comme c.toArray(new String[0])). Dans les versions plus anciennes Java, il était recommandé d'utiliser un tableau pré-dimensionné, car l'appel de réflexion nécessaire à la création d'un tableau de taille appropriée était assez lent. Cependant, depuis les dernières mises à jour de OpenJDK 6, cet appel a été intrinsèque, rendant les performances de la version tableau vide identiques, voire parfois meilleures, par rapport à la version pré-dimensionnée. Le passage d'un tableau pré-dimensionné est également dangereux pour une collecte simultanée ou synchronisée, car une course de données est possible entre la taille et l'appel toArray, ce qui peut entraîner des valeurs NULL supplémentaires à la fin du tableau, si la collection a été simultanément réduite lors de l'opération. Vous pouvez suivre le style uniforme: soit en utilisant un tableau vide (ce qui est recommandé dans Java moderne) ou en utilisant un tableau pré-dimensionné (qui peut être plus rapide dans les versions antérieures Java ou non-HotSpot) JVM basées)).

2
Alexander Savin
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

Cela dépend de ce que vous voulez réaliser. Si vous devez manipuler le tableau ultérieurement, cela coûterait plus d'effort que de conserver la chaîne dans ArrayList. Vous avez également un accès aléatoire avec un ArrayList par list.get( index );

1
stacker
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
Aleksey Bykov

L'interface Collection inclut la méthode toArray () pour convertir une nouvelle collection en tableau. Il existe deux formes de cette méthode. La version sans argument renverra les éléments de la collection dans un tableau Object: public Object [] toArray (). Le tableau retourné ne peut pas être converti en un autre type de données. C'est la version la plus simple. Dans la deuxième version, vous devez indiquer le type de données du tableau que vous souhaitez renvoyer: public Object [] toArray (type d’objet []).

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

pour référence, référez-vous à ce lien http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html

0
satish

Une solution consisterait à ajouter la seconde boucle, l’impression étant effectuée dans la première boucle. Comme ça:

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
Vipin Menon