public static int[] convertListToArray(List<Integer> listResult) {
        int[] result = new int[listResult.size()];
        int i= 0;
        for (int num : listResult) {
            result[i++] = num;
        }
        return result;
    }

¿Hay una manera eficaz de convertir la Lista de la matriz sin la iteración Lista explícitamente ?
Tal vez es posible mediante el uso de métodos como:

Arrays.copyOf(int [] origin , int newLength );
System.arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

Sé que no es una solución que se ha descrito aquí. Sin embargo, yo particularmente interesado en una manera eficiente de conversión de List<Integer> a int[]

  • Posibles duplicados de la Conversión de ‘ArrayList<Cadena> a ‘String[]’ en Java
  • Excepto String es un tipo de objeto y int es una primitiva. Integer[] no es int[].
  • Tim – Ver mi comentario a Andrii anteriormente, es int importante aquí? Si es así, resáltelo en la pregunta, por ejemplo, «Lista de Enteros a un primitivo int[]»
  • Tim También: ¿Por Qué? ¿Qué crees que va a ser ineficientes acerca de lo que usted tiene? Como no hay una que sea necesaria la conversión (Integer => int), no vas a ser capaz de descargar esta a una llamada de sistema bajo el capó, o similar… podría llegar a ser más eficaz el uso de toArray para obtener una Integer[] y, a continuación, hacer el bucle, pero también posiblemente no. Tendría que hacer un punto de referencia en su objetivo de código para ver si fue una mejora sobre lo que usted tiene.
  • está usted usando java 8 ? – usted puede utilizar el java 8 stream creo
  • sí. Yo uso java 8. Sin embargo, estoy más que interesante en java 7 ( y debajo ) de las soluciones.
  • Crowder. Thx por tu atención. Sí, si usted lo permite, me gustaría destacar el problema de la restricción Integer[] => int[]
  • No puede ser una técnica que no iterar, como int[] y Integer[] no son mutuamente coercible.

InformationsquelleAutor Tim Florian | 2017-01-07

3 Comentarios

  1. 8

    Dada la necesidad de convertir de Integer a int, no creo que usted va a encontrar algo más eficiente de lo que tienes, si yo asumo que usted está hablando sobre el tiempo de ejecución de la eficiencia.

    Que podría encontrar la conversión a Integer[] primero y luego el bucle podría ser más eficiente (más abajo), pero es posible que no, demasiado. Tendrías que probarlo en su situación específica y ver.

    Aquí está el ejemplo:

    int size = listResult.size();
    int[] result = new int[size];
    Integer[] temp = listResult.toArray(new Integer[size]);
    for (int n = 0; n < size; ++n) {
        result[n] = temp[n];
    }
    • Gracias por su ayuda !
    • esto no responde a la pregunta
  2. 11

    Si la eficiencia es su principal preocupación, creo que usted puede utilizar su solución y hacer más eficiente mediante el uso de un índice para el bucle en la listResult si es RandomAccess. Sin embargo, esto hace que el código sea mucho menos legible, y que tendría que punto de referencia para sus casos de uso para ver si es más eficiente.

    public static int[] convertListToArray(List<Integer> listResult) {
        int size = listResult.size();
        int[] result = new int[size];
        if (listResult instanceof RandomAccess)
        {
            for (int i = 0; i < size; i++)
            {
                result[i] = listResult.get(i);
            }
        }
        else
        {
            int i = 0;
            for (int num : listResult) {
                result[i++] = num;
            }
        }
        return result;
    }

    Si el uso de Java 8 y quisiera escribir menos código, puede utilizar las Corrientes de la biblioteca.

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    int[] array = list.stream().mapToInt(i -> i).toArray();

    Si usted está abierto para el uso de una biblioteca de terceros, usted puede Eclipse Colecciones de la siguiente manera.

    MutableList<Integer> list = Lists.mutable.with(1, 2, 3, 4, 5);
    int[] array = list.collectInt(i -> i).toArray();

    El siguiente es un poco más de código, pero es la solución más eficiente que pueda surgir con el uso de Eclipse Colecciones.

    MutableList<Integer> list = Lists.mutable.with(1, 2, 3, 4, 5);
    int[] array = new int[list.size()];
    list.forEachWithIndex((each, index) -> array[index] = each);

    Si necesita utilizar el java.util.List de la interfaz, el ListIterate clase de utilidad puede ser utilizado desde Eclipse Colecciones.

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    int[] array = new int[list.size()];
    ListIterate.forEachWithIndex(list, (each, index) -> array[index] = each);

    La ListIterate utilidad de utilizar diferentes iteración código para RandomAccess listas y noRandomAccess listas.

    El más eficiente cosa a hacer sería cambiar el List<Integer> a un MutableIntList en Eclipse Colecciones o en otra biblioteca que cuenta con el apoyo de primitivas colecciones.

    Nota: soy un confirmador de Eclipse Colecciones.

    • Tengo problemas para ver cómo el índice de bucle es más eficiente que la mayor bucle for ?
    • La mayor de bucle para crear un Iterador. Sin embargo, ahora que me pongo a pensar que hacer un punto justo. Si la Lista es una LinkedList, el acceso indizado enfoque sería mucho peor. Esta es una razón interna iteradores en colecciones son preferibles en mi opinión.
    • He actualizado la respuesta a manejar tanto RandomAccess y no RandomAccess Listas. No hay una «garantía» de que el indexado de acceso será más rápido para la evaluación comparativa de los casos de uso específicos, sería la única manera de mostrar si es más rápido. docs.oracle.com/javase/8/docs/api/java/util/RandomAccess.html
    • Habría una forma de hacerlo más eficiente, si se conoce la List es un ArrayList? Sería más eficiente para convertir la matriz subyacente por Arrays.stream(array).mapToInt(Integer::intValue).toArray();?
  3. 4

    En Java 8:

    int[] anArray = list.stream()
                        .filter(Objects::nonNull)
                        .mapToInt(Integer::intValue)
                        .toArray();

Dejar respuesta

Please enter your comment!
Please enter your name here