web-dev-qa-db-fra.com

Tableau à collectionner: code optimisé

Y a-t-il un meilleur moyen d'y parvenir?

public static List<String> toList(String[] array) {

    List<String> list = new ArrayList(array.length);

    for(int i=0; i<array.length; i++)
        list.add(array[i]);

    return list;
}

REMARQUE: Arrays.asList (a) Retourne une liste de taille fixe sauvegardée par le tableau spécifié. (Modifications apportées à la liste renvoyée "write through" dans le tableau.). Je ne veux pas ce comportement. Je suppose que MA fonction ci-dessus contourne cela (ou est-ce que je me trompe?)

Donc, nous avons ici la méthode alternative:

public static List<String> toList(String[] array) {

    List<String> list = new ArrayList(array.length);

    list.addAll(Arrays.asList(array));

    return list;
}

Juste en le regardant, Je ne crois pas que ce soit plus rapide que la première méthode .

32
marcolopes

Qu'entendez-vous par meilleur moyen:

plus lisible:

List<String> list = new ArrayList<String>(Arrays.asList(array));

moins de consommation de mémoire, et peut-être plus rapide (mais certainement pas thread-safe):

public static List<String> toList(String[] array) {
    if (array==null) {
       return new ArrayList(0);
    } else {
       int size = array.length;
       List<String> list = new ArrayList(size);
       for(int i = 0; i < size; i++) {
          list.add(array[i]);
       }
       return list;
    }
}

Btw: voici un bug dans votre premier exemple:

array.length lève une exception de pointeur null si array est null, la vérification if (array!=null) doit donc être effectuée en premier.

35
Ralph
Arrays.asList(array);    

Exemple: 

 List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");

Voir Arrays.asList documentation de la classe.

27
Jigar Joshi
Arrays.asList(array)

Arrays utilise new ArrayList(array). Mais ce n'est pas le Java.util.ArrayList. C'est très similaire cependant. Notez que ce constructeur prend le tableau et le place comme tableau de sauvegarde de la liste. Donc, c'est O(1).

Si vous avez déjà créé la liste, Collections.addAll(list, array), mais cela est moins efficace.

Mise à jour: Ainsi, votre Collections.addAll(list, array) devient une bonne option. Un emballage de celui-ci est la Lists.newArrayList(array) de la goyave. 

17
Bozho

Une autre façon de le faire:

Collections.addAll(collectionInstance,array);
13
diegoehg

Qu'en est-il de :

List myList = new ArrayList(); 
String[] myStringArray = new String[] {"Java", "is", "Cool"}; 

Collections.addAll(myList, myStringArray); 
7
ant

Vous pouvez utiliser:

list.addAll(Arrays.asList(array));
5
Mohamed Saligh

Vous pouvez essayer quelque chose comme ça:

List<String> list = new ArrayList<String>(Arrays.asList(array));

public ArrayList (Collection c)

Construit une liste contenant le éléments de la collection spécifiée, dans l'ordre dans lequel ils sont retournés par le itérateur de la collection. La liste de tableaux instance a une capacité initiale de 110% de la taille de la spécifiée collection.

Tiré de ici

2
npinti

Avez-vous vérifié Arrays.asList(); voir API

1
posdef

Oui il y a. Vous pouvez utiliser la classe Arrays du package Java.util. *. Ensuite, il s’agit en fait d’une seule ligne de code.

List<String> list = Arrays.asList(array);
1
MarioB.

Basé sur la référence de Java.util.Collections.addAll(Collection<? super String> c, String... elements), sa mise en œuvre est similaire à votre première méthode, elle dit

Ajoute tous les éléments spécifiés à la collection spécifiée. Les éléments à ajouter peuvent être spécifiés individuellement ou sous forme de tableau. Le comportement de cette méthode pratique est identique à celui de c.addAll (Arrays.asList (elements)), mais cette méthode est susceptible de s'exécuter beaucoup plus rapidement dans la plupart des implémentations.

Son implémentation dans jdk est (jdk7)

public static <T> boolean addAll(Collection<? super T> c, T... elements) {
    boolean result = false;
    for (T element : elements)
        result |= c.add(element);
    return result;
}

Donc, parmi vos exemples, la meilleure approche doit être Collections.addAll(list, array);

Depuis Java 8, on peut utiliser Stream api qui peut mieux fonctionner

Par exemple:- 

String[] array = {"item1", "item2", "item3"};

Stream<String> stream = Stream.of(array);

//if the array is extremely large 
stream = stream.parallel();

final List<String> list = stream.collect(Collectors.toList());

Si le tableau est très grand, nous pouvons le faire comme une opération batch en parallèle en utilisant un flux parallèle (stream = stream.parallel()) qui utilisera tous les processeurs pour terminer la tâche rapidement. Si la longueur de la matrice est très petite, le flux parallèle prendra plus de temps que le flux séquentiel.

0
Visruth