2010-03-15 15 views
20

Tengo un con un montón de Integers en él. Quiero convertirlo en una matriz, pero llamar¿Cómo puedo convertir un Java HashSet <Integer> en una matriz int primitiva?

hashset.toArray(); 

devuelve un Object[]. ¿Hay una mejor manera de convertirlo a una matriz de int que no sea iterar a través de cada elemento manualmente? Quiero pasar la matriz a

void doSomething(int[] arr) 

que no aceptará el objeto de matriz [], incluso si intento lanzarlo como

doSomething((int[]) hashSet.toArray()); 

Respuesta

18

de Apache ArrayUtils tiene esta (todavía itera behind the scenes):

doSomething(ArrayUtils.toPrimitive(hashset.toArray())); 

Son siempre un buen lugar para comprobar si hay cosas como esta.

+2

Automatic +1 para recomendar Apache Commons. – skaffman

+0

@skaffman Recomendaría Apache Commons Lang ... aunque no para este problema en particular ... pero de todos modos, haga su jugada;) – sfussenegger

+0

En realidad, no se repite entre bastidores: itera dos veces. Hay un 'Integer []' innecesario que ralentiza el proceso de creación de una matriz primitiva de una colección. En realidad, creo que la opción de usar 'Integer []' como parámetro para 'toPrimitive (..)' en lugar de 'Iterable ' es un poco torpe ya que 'Arrays.asList (Integer [])' es una operación mucho más rápida que 'collection.toArray()'. Por lo tanto, no haré +1 automáticamente para recomendar apache commons :) – sfussenegger

2

Nop; tienes que iterar sobre ellos. Lo siento.

+0

Tiene sentido si lo piensas bien. Los ints no son objetos, por lo que el encasillado de uno al otro no funciona. –

+1

Parece extraño que no se pueda obtener una matriz de entradas de un HashSet de enteros, ¿no debería el autoboxing entrar en acción y permitirte hacerlo? No es como que el HashSet contiene una mezcla de tipos, todos son enteros, así que (por lo que puedo ver), no sería un problema. – jackbot

+2

Las colecciones solo pueden contener objetos (enteros en su caso). Por lo tanto, sería extraño tener un método especial para obtener una matriz de ints (los métodos correspondientes serían necesarios para otros tipos primitivos). El auto-boxeo no ayuda, porque eso solo se aplica a una conversión de objetos primitivos <->. Tenga en cuenta que la clase real (debido a borrado de tipo) es HashSet, no HashSet (solo un concepto de tiempo de compilación). –

4
public int[] toInt(Set<Integer> set) { 
    int[] a = new int[set.size()]; 
    int i = 0; 
    for (Integer val : set) a[i++] = val; 
    return a; 
} 

Ahora que escribí el código para usted ya no es ese manual, ¿verdad? ;)

+3

No fue que escribir el código para hacerlo manualmente era un problema, solo tenía curiosidad por ver si había una mejor forma de hacerlo – jackbot

+0

Bueno, la esencia de mi respuesta fue que la única forma de evitar escribir este código es conseguir que otros lo escriban (pero en realidad es el caso de casi cualquier código), lo cual hiciste con éxito;) – sfussenegger

+0

¿Puedes poner null en un Establecer ? Si es así, este código será NPE. Sin embargo, no estoy seguro de lo que el póster original querría hacer con nulos. Supongo que los omite de la matriz resultante. – davidsheldon

-4

También podría usar la variante toArray (T [] contents) del método toArray(). Crear un conjunto vacío de enteros del mismo tamaño que el HashSet, y luego pasarlo al método toArray():

Integer[] myarray = new Integer[hashset.size()]; 
doSomething(hashset.toArray(myarray)); 

Habría que cambiar la función doSomething() para aceptar una matriz en lugar de int[]Integer[]. Si eso no es posible, habría convertido la matriz de valores devueltos por toArray a int[].

+1

No, no se compilará. – jkff

+0

Ayudaría a proporcionar sus errores de compilación para que pueda ver cuál es el problema con mi código. – Shiprack

+2

¿Por qué no intentas compilarlo tú mismo? Una vez que vea el error de compilación, puedo explicarle por qué sucedió. – jkff

3

puede convertir un Set<Integer> a Integer[] incluso sin Apache Utilidades:

Set<Integer> myset = new HashSet<Integer>(); 
Integer[] array = myset.toArray(new Integer[0]); 

Sin embargo, si necesita int[] hay que iterar sobre el conjunto.

4

Usted sólo puede utilizar la guayaba de:

Ints.toArray(Collection<? extends Number> collection) 
8

puede crear una int[] de cualquier Collection<Integer> (incluyendo un) utilizando Java 8 corrientes:

int[] array = coll.stream().mapToInt(Number::intValue).toArray(); 

La biblioteca sigue interactuando sobre la colección (u otra fuente de transmisión) en su nombre, por supuesto.

Además de ser conciso y no tener dependencias de biblioteca externas, las transmisiones también le permiten ir en paralelo si tiene una gran colección para copiar.

+0

Un poco más conciso: int [] array = coll.stream(). MapToInt (x -> x) .toArray() – HammerNL

Cuestiones relacionadas