2011-05-19 26 views
6

en el mundo Android de Java, ¿existe una forma directa (idealmente de una sola llamada) de convertir una matriz de int en una ArrayList<Integer> y viceversa? Llamando toArray() en el ArrayList devuelve una matriz de Integer - no es exactamente lo que quiero.(Un) matrices primitivas de boxeo en Java

puedo hacerlo fácilmente con la mano con un bucle (ya lo hizo, de hecho). Me pregunto si la biblioteca/idioma admite lo mismo.

EDIT: gracias a todos, ya he escrito mi propio boxeador y unboxer. Me sorprende que los diseñadores de lenguaje/RTL no pensaran por sí mismos, especialmente con los tipos primitivos que, por diseño, no son elegibles para las colecciones.

+1

Core Java no lo hace. Estoy seguro de que alguien puede proporcionar un enlace a una biblioteca de terceros que puede hacerlo por usted. – jjnguy

+0

posible duplicado de [¿Cómo convertir int \ [\] en la lista en Java?] (Http://stackoverflow.com/questions/1073919/how-to-convert-int-into-listinteger-in-java) – finnw

Respuesta

1

Common.Lang de Apache tiene una clase de utilidad que lo hace: ArrayUtils

+0

'ArrayUtils' no hace conversión entre matrices primitivas y colecciones. – ColinD

+1

@ColinD: tiene razón en Array() debe solicitar antes. – h3xStream

3

Si crea un método de utilidad que sería una conversión de una llamada. Quizás en su caso sería mejor que agregar una biblioteca completa (de la cual solo podría usar una función), aunque eso debería ser una carga excesiva para su aplicación.

Aquí está la source code por la respuesta h3xStream (contento de que utiliza la licencia Apache);)

9

Usando Guava (Ints.asList(int...) y Ints.toArray(Collection<Integer>)):

int[] intArray = ... 
List<Integer> intArrayAsList = Ints.asList(intArray); 
int[] intArray2 = Ints.toArray(intArrayAsList); 

Nota que como Arrays.asListInts.asList, devuelve una lista que es una vista de la matriz dada. No puede agregar o quitar de él, pero puede set el valor en un índice específico. También puede copiarlo en un nuevo ArrayList si quieres:

List<Integer> arrayList = Lists.newArrayList(Ints.asList(intArray)); 

guayaba tiene los mismos métodos para todos los tipos primitivos.

+1

No estoy introduciendo una nueva dependencia en el proyecto por el bien de una función de tres líneas que podría escribir mientras duermo. –

1

he conseguido encontrar una solución en Java 8:

import java.util.Arrays; 
... 
double[] columnsValue = {...}; 
Double[] values = Arrays.stream(columnsValue).boxed().toArray(Double[]::new); 

no puedo explicar lo que significa exactamente Double[]::new, porque yo no sabía esta característica de Java 8 antes (de hecho , IntelliJ IDEA escribió esto para mí), pero parece que lo está haciendo new Double(double) en cada elemento de la matriz.

Tenga en cuenta: He probado esto solo en el escritorio, no sé si funciona en Android.

+0

Lo que estás haciendo allí en realidad es solo * boxing * (convertir una primitiva a su clase contenedora correspondiente), no * unboxing * (convertir desde una clase contenedora a su primitiva correspondiente). – Allison

0

Boxing y unboxing (sin bibliotecas especializadas):

// Necessary Imports: 
import java.util.*; 
import java.util.stream.*; 

// Integers: 
int[] primitives = {1, 2, 3}; 
Integer[] boxed = Arrays.stream(primitives).boxed().toArray(Integer[]::new); 
int[] unboxed = Arrays.stream(boxed).mapToInt(Integer::intValue).toArray(); 

// Doubles: 
double[] primitives = {1.0, 2.0, 3.0}; 
Double[] boxed = Arrays.stream(primitives).boxed().toArray(Double[]::new); 
double[] unboxed = Arrays.stream(boxed).mapToDouble(Double::doubleValue).toArray(); 

Tenga en cuenta que esto requiere Java 8 (Stream Documentation).

Para cualquier persona que desconozca lo que significa el ::, se usa para hacer un Method Reference.

+1

Requiere Java 8? –

+0

@SevaAlekseyev Sí, por supuesto –

+0

@SevaAlekseyev Sí, lo siento, lo actualizaré para mencionarlo. – Allison