2009-12-30 9 views
22

Cela ne fonctionne pas malheureusement:Conversion d'un tableau de temps à Arraylist <Long>

long[] longs = new long[]{1L}; 
ArrayList<Long> longArray = new ArrayList<Long>(longs); 

est-il un moyen plus agréable, sauf les ajouter manuellement?

+5

En relation (proche) avec http://stackoverflow.com/questions/754294/convert-an-array-of-primit ive-longs-dans-une-liste-de-longs/1974363 # 1974363 –

Répondre

42

En utilisant ArrayUtils de apache commons-lang

long[] longs = new long[]{1L}; 
Long[] longObjects = ArrayUtils.toObject(longs); 
List<Long> longList = java.util.Arrays.asList(longObjects); 
+0

+1 Battez-moi, dammit, il m'a fallu trop longtemps pour faire défiler le javadoc 'ArrayUtils' :) – skaffman

+2

:) Je l'ai ouvert dans mon éclipse (en utilisant un décompilateur) – Bozho

+0

Ce n'est pas très important, mais je n'aime pas copier le tableau deux fois. J'ai fini par lancer une fonction d'utilité pour le faire directement. – ripper234

9

Vous pouvez éviter la copie en mettant en place une AbstractList via une usine statique. Toutes les modifications apportées à la liste sont écrites dans le tableau et vice-versa.

Créez cette méthode quelque part.

public static List<Long> asList(final long[] l) { 
    return new AbstractList<Long>() { 
     public Long get(int i) {return l[i];} 
     // throws NPE if val == null 
     public Long set(int i, Long val) { 
      Long oldVal = l[i]; 
      l[i] = val; 
      return oldVal; 
     } 
     public int size() { return l.length;} 
    }; 
} 

Puis appelez simplement cette méthode pour créer le tableau. Vous devrez utiliser l'interface List et non l'implémentation ArrayList dans votre déclaration.

long[] longs = new long[]{1L, 2L, 3L}; 
List<Long> longArray = asList(longs); 

Je pris cette technique du language guide.

2

La réponse de Bozho est bonne, mais je n'aime pas copier le tableau deux fois. J'ai fini par rouler ma propre méthode utilitaire pour cela:

public static ArrayList<Long> convertArray(long[] array) { 
    ArrayList<Long> result = new ArrayList<Long>(array.length); 
    for (long item : array) 
    result.add(item); 
    return result; 
} 
+1

Notez que dans la réponse de bozho, le tableau n'est pas copié deux fois, mais seulement une fois: Arrays.asList ne renvoie pas de copie, mais renvoie un wrapper autour du tableau (l'encapsuleur implémente l'interface List). La première copie est nécessaire car Arrays.asList ne fonctionne pas avec les types primitifs, d'où la première conversion de primitive (long) en type d'objet (Long). Voir la réponse de Wayne Young pour la solution d'encapsuleur direct (pas de copie du tout). – barjak

5

utilisation Note de java.lang.Long, non long

final Long[] longs = new Long[]{1L}; 
final List<Long> longArray = Arrays.asList(longs); 

n'ajoute toutes les dépendances thirdparty.

+0

Si vous pouvez changer le problème, vous pouvez directement utiliser Arrays.asList() et n'avez pas besoin de cette construction ArrayList supplémentaire. –

+0

Sûrement nous voulons tous changer le problème à quelque chose de plus facile à résoudre? J'ai donc édité mon post pour reféter la solution nettoyante de Wayne. Doit se rappeler de lire par ses propres messages d'abord. –

0

utilisant Dollar vous pouvez faire cette conversion en seulement 1 ligne de code:

long[] longs = new long[]{1L}; 
List<Long> longList = $(longs).toList(); 

vous pouvez aussi les boîte facilement:

Long[] arrayOfLongs = $(longs).toArray(); 
0

En JDK 1.8, avec Lambda et API Stream, nous peut le faire comme ceci:

long[] longArr = {3L, 4L, 5L, 6L, 7L}; 
List<Long> longBoxArr = Arrays.stream(longArr).boxed().collect(Collectors.toList()); 
Questions connexes