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

1025

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

Alex
la source
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.

Bozho
la source
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);
Vitalii Fedorenko
la source
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!

codécubé
la source
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.

Rajesh Vemula
la source
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
Naman
la source
10

En Java 8:

String[] strings = list.parallelStream().toArray(String[]::new);
Mike Shauneu
la source
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);
KayV
la source
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);
Khaled Lela
la source
5
List <String> list = ...
String[] array = new String[list.size()];
int i=0;
for(String s: list){
  array[i++] = s;
}
HZhang
la source
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()));
  }
}
Roberto Attias
la source
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.

Yoory N.
la source
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.

Vatsal Chavda
la source
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
5

En Java 11, nous pouvons utiliser la Collection.toArray(generator)méthode. Le code suivant créera un nouveau tableau de chaînes:

List<String> list = List.of("one", "two", "three");
String[] array = list.toArray(String[]::new)

de java.base java.util.Collection.toArray() .

Rafal Borowiec
la source
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);
nick w.
la source
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]);
    }
Panchal Nilkanth
la source
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;
}
Denis Fedak
la source