Conversion de 'ArrayList <String> en' String [] 'en Java


1025

Comment convertir un ArrayList<String>objet en String[]tableau en Java?


2
Ont fait cette réponse avec une approche mise à jour avec JDK-11 introduisant une nouvelle API tout aussi performante toArray(T[])et similaire en syntaxe Stream.toArray.
Naman

Réponses:


1792
List<String> list = ..;
String[] array = list.toArray(new String[0]);

Par exemple:

List<String> list = new ArrayList<String>();
//add some stuff
list.add("android");
list.add("apple");
String[] stringArray = list.toArray(new String[0]);

La toArray()méthode sans passer aucun argument renvoie Object[]. Vous devez donc passer un tableau comme argument, qui sera rempli avec les données de la liste et renvoyé. Vous pouvez également passer un tableau vide, mais vous pouvez également passer un tableau avec la taille souhaitée.

Mise à jour importante : à l'origine le code ci-dessus utilisé new String[list.size()]. Cependant, ce blog révèle qu'en raison des optimisations JVM, l'utilisation new String[0]est meilleure maintenant.


16
La taille de l'argument fait-elle une différence?
Thorbjørn Ravn Andersen

37
cela permet d'économiser une instnation de baie supplémentaire
Bozho

59
Il s'avère que fournir un tableau de longueur nulle, même le créer et le jeter, est en moyenne plus rapide que d'allouer un tableau de la bonne taille. Pour les repères et les explications, voir ici: shipilev.net/blog/2016/arrays-wisdom-ancients
Stuart Marks

2
(Désolé. Question rhétorique. La réponse est, bien sûr, parce que Java ne fait pas de vrais génériques; il les
simule

3
@lyuboslavkanev Le problème est qu'avoir le type générique en Java n'est pas suffisant pour créer réellement des objets basés sur ce type; pas même un tableau (ce qui est ridicule, car cela devrait fonctionner pour tout type). Pour autant que je sache, tout ce qui peut être fait est de lancer. En fait, pour même créer des objets du type, vous devez avoir l' Classobjet réel , ce qui semble être complètement impossible à dériver du type générique. Comme je l'ai dit, la raison en est que toute la construction est fausse; tout est simplement stocké sous forme d'objet en interne.
Nyerguds

170

Une alternative en Java 8:

String[] strings = list.stream().toArray(String[]::new);

Java 11+:

String[] strings = list.toArray(String[]::new);

25
Ou des avantages?
James Watkins

1
Je préférerais cette syntaxe, mais IntelliJ affiche une erreur de compilation avec cela, se plaint "T [] n'est pas une interface fonctionnelle."
Glen Mazza

3
@GlenMazza que vous ne pouvez utiliser que toArraysur un Streamobjet. Cette erreur de compilation peut se produire si vous réduisez le flux à l'aide de a Collectorspuis essayez d'appliquer toArray.
Udara Bentota

39

Vous pouvez utiliser la toArray()méthode pour List:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = list.toArray(new String[list.size()]);

Ou vous pouvez ajouter manuellement les éléments à un tableau:

ArrayList<String> list = new ArrayList<String>();

list.add("apple");
list.add("banana");

String[] array = new String[list.size()];

for (int i = 0; i < list.size(); i++) {
    array[i] = list.get(i);
}

J'espère que cela t'aides!


30
ArrayList<String> arrayList = new ArrayList<String>();
Object[] objectList = arrayList.toArray();
String[] stringArray =  Arrays.copyOf(objectList,objectList.length,String[].class);

En utilisant copyOf, ArrayList aux tableaux peut également être fait.


4
Suggérez camelcase donc "objectList = ..." et "stringArray". C'est aussi Arrays.copyOf ... capital O.
Jason Weden

1
list.toArray () utilise en interne Arrays.copyOf ()
David

25

À partir de Java-11, on peut également utiliser l'API Collection.toArray(IntFunction<T[]> generator)pour obtenir la même chose que:

List<String> list = List.of("x","y","z");
String[] arrayBeforeJDK11 = list.toArray(new String[0]);
String[] arrayAfterJDK11 = list.toArray(String[]::new); // similar to Stream.toArray

10

En Java 8:

String[] strings = list.parallelStream().toArray(String[]::new);

12
C'est vraiment déjà contenu dans cette réponse . Peut-être l'ajouter en tant que modification à cette réponse au lieu d'une toute nouvelle.
River

11
Pourquoi parallelStream()au lieu de simplement stream()?
Yoory N.

7

En Java 8, cela peut être fait en utilisant

String[] arrayFromList = fromlist.stream().toArray(String[]::new);

6

Génériques solution secrète tout List<Type>à String []:

public static  <T> String[] listToArray(List<T> list) {
    String [] array = new String[list.size()];
    for (int i = 0; i < array.length; i++)
        array[i] = list.get(i).toString();
    return array;
}

Remarque Vous devez override toString()méthode.

class Car {
  private String name;
  public Car(String name) {
    this.name = name;
  }
  public String toString() {
    return name;
  }
}
final List<Car> carList = new ArrayList<Car>();
carList.add(new Car("BMW"))
carList.add(new Car("Mercedes"))
carList.add(new Car("Skoda"))
final String[] carArray = listToArray(carList);

5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}

13
Cela fonctionne, mais n'est pas super efficace, et duplique la fonctionnalité dans la réponse acceptée avec du code supplémentaire.
Alan Delimon

5

dans le cas où une manipulation supplémentaire des données est souhaitée, pour laquelle l'utilisateur souhaite une fonction, cette approche n'est pas parfaite (car elle nécessite de passer la classe de l'élément comme deuxième paramètre), mais fonctionne:

import java.util.ArrayList; import java.lang.reflect.Array;

public class Test {
  public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    al.add(1);
    al.add(2);
    Integer[] arr = convert(al, Integer.class);
    for (int i=0; i<arr.length; i++)
      System.out.println(arr[i]);
  }

  public static <T> T[] convert(ArrayList<T> al, Class clazz) {
    return (T[]) al.toArray((T[])Array.newInstance(clazz, al.size()));
  }
}

5

Si votre application utilise déjà la bibliothèque Apache Commons, vous pouvez légèrement modifier la réponse acceptée pour ne pas créer un nouveau tableau vide à chaque fois:

List<String> list = ..;
String[] array = list.toArray(ArrayUtils.EMPTY_STRING_ARRAY);

// or if using static import
String[] array = list.toArray(EMPTY_STRING_ARRAY);

Il existe quelques autres tableaux vides préalloués de différents types dans ArrayUtils .

Nous pouvons aussi tromper JVM pour créer un tableau vide pour nous de cette façon:

String[] array = list.toArray(ArrayUtils.toArray());

// or if using static import
String[] array = list.toArray(toArray());

Mais il n'y a vraiment aucun avantage de cette façon, juste une question de goût, OMI.


5

Vous pouvez utiliser Iterator<String>pour itérer les éléments de ArrayList<String>:

ArrayList<String> list = new ArrayList<>();
String[] array = new String[list.size()];
int i = 0;
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); i++) {
    array[i] = iterator.next();
}

Vous pouvez désormais retirer des éléments de String[]toute boucle.


J'ai rétrogradé parce que: 1. pas d'utilisation de génériques qui vous forcent à 2. utiliser .toString()là où aucun transtypage explicite ne serait nécessaire, 3. vous n'incrémentez même pas i, et 4. le whilemieux serait remplacé par un for. Code suggéré:ArrayList<String> stringList = ... ; String[] stringArray = new String[stringList.size()]; int i = 0; for(Iterator<String> it = stringList.iterator(); it.hasNext(); i++) { stringArray[i] = it.next(); }
Olivier Grégoire

D'accord, je l'ai maintenant. Merci.
Vatsal Chavda

Eh bien, idéalement, vous devriez éditer votre code pour inclure ces commentaires (c'est-à-dire ... si vous pensez qu'ils sont bons pour votre réponse!). Je ne vais pas envisager de supprimer mon downvote tant que le code reste inchangé.
Olivier Grégoire

Je suis nouveau ici, donc je ne sais pas encore comment les choses fonctionnent ici. Cependant, appréciez votre aide.
Vatsal Chavda

Ceci est vraiment mieux! J'ai édité juste un peu, mais vous venez de découvrir comment cela fonctionne: apporter des réponses, les améliorer, récupérer les lauriers;)
Olivier Grégoire


4
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String [] strArry= list.stream().toArray(size -> new String[size]);

Par commentaires, j'ai ajouté un paragraphe pour expliquer comment fonctionne la conversion. Tout d'abord, List est converti en un flux String. Ensuite, il utilise Stream.toArray pour convertir les éléments du flux en tableau. Dans la dernière instruction ci-dessus, "size -> new String [size]" est en fait une fonction IntFunction qui alloue un tableau String avec la taille du flux String. La déclaration est identique à

IntFunction<String []> allocateFunc = size -> { 
return new String[size];
};   
String [] strArry= list.stream().toArray(allocateFunc);

4
Quelle valeur ajoute cette réponse? Il semble simplement répéter d'autres réponses sans expliquer pourquoi il répond à la question.
Richard

2

Vous pouvez convertir List en tableau String en utilisant cette méthode:

 Object[] stringlist=list.toArray();

L'exemple complet:

ArrayList<String> list=new ArrayList<>();
    list.add("Abc");
    list.add("xyz");

    Object[] stringlist=list.toArray();

    for(int i = 0; i < stringlist.length ; i++)
    {
          Log.wtf("list data:",(String)stringlist[i]);
    }

1
private String[] prepareDeliveryArray(List<DeliveryServiceModel> deliveryServices) {
    String[] delivery = new String[deliveryServices.size()];
    for (int i = 0; i < deliveryServices.size(); i++) {
        delivery[i] = deliveryServices.get(i).getName();
    }
    return delivery;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.