while loop for espaƱol enhanced java arrays integer arraylist

java - loop - Arrays.asList() de una matriz



goto java (9)

Consideremos el siguiente ejemplo simplificado:

public class Example { public static void main(String[] args) { int[] factors = {1, 2, 3}; ArrayList<Integer> f = new ArrayList(Arrays.asList(factors)); System.out.println(f); } }

En la línea de impresión esto imprime algo así como "[[I @ 190d11]", lo que significa que realmente ha construido una ArrayList que contiene matrices en int.

Su IDE y compilador deben advertir sobre las asignaciones no verificadas en ese código. Siempre debe usar new ArrayList<Integer>() new ArrayList<>() o new ArrayList<>() lugar de new ArrayList() . Si lo hubiera utilizado, habría habido un error de compilación al intentar pasar List<int[]> al constructor.

No existe un autoboxing de int[] a Integer[] , y de todos modos el autoboxing es solo azúcar sintáctico en el compilador, por lo que en este caso debe hacer la copia de la matriz manualmente:

public static int getTheNumber(int[] factors) { List<Integer> f = new ArrayList<Integer>(); for (int factor : factors) { f.add(factor); // after autoboxing the same as: f.add(Integer.valueOf(factor)); } Collections.sort(f); return f.get(0) * f.get(f.size() - 1); }

¿Qué está mal con esta conversión?

public int getTheNumber(int[] factors) { ArrayList<Integer> f = new ArrayList(Arrays.asList(factors)); Collections.sort(f); return f.get(0)*f.get(f.size()-1); }

Hice esto después de leer la solución que se encuentra en Create ArrayList from array . La segunda línea (clasificación) en getTheNumber(...) causa la siguiente excepción:

Excepción en el hilo "principal" java.lang.ClassCastException: [No puedo convertirme en java.lang.Comparable]

¿Que esta mal aquí? Me doy cuenta de que la clasificación podría hacerse con Arrays.sort() , solo tengo curiosidad sobre esta.


Creo que has encontrado un ejemplo donde el auto-boxing realmente no funciona. Como Arrays.asList(T... a) tiene un parámetro varargs, el compilador aparentemente considera el int [] y devuelve un List<int[]> con un solo elemento.

Deberías cambiar el método en esto:

public int getTheNumber(Integer[] factors) { ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(factors)); Collections.sort(f); return f.get(0) * f.get(f.size() - 1); }

y posiblemente agregar esto para compatibilidad

public int getTheNumber(int[] factors) { Integer[] factorsInteger = new Integer[factors.length]; for(int ii=0; ii<factors.length; ++ii) { factorsInteger[ii] = factors[ii]; } return getTheNumber(factorsInteger); }


Estás intentando convertir int [] en Integer [], esto no es posible.

Puede usar ArrayUtils de commons-lang para convertir los enteros en enteros antes de obtener la lista de la matriz:

public int getTheNumber(int[] factors) { Integer[] integers = ArrayUtils.toObject(factors); ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(integers)); Collections.sort(f); return f.get(0)*f.get(f.size()-1); }


Esto funciona desde Java 5 a 7:

public int getTheNumber(Integer... factors) { ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(factors)); Collections.sort(f); return f.get(0)*f.get(f.size()-1); }

En Java 4 no hay vararg ... :-)


Por lo que yo entiendo, la función de clasificación en la clase de colección solo se puede usar para clasificar las colecciones que implementan la interfaz comparable.

Usted le está suministrando una matriz de enteros. Probablemente deberías ajustar esto alrededor de una de las clases conocidas de Wrapper como Integer. Entero implementa comparable.

Ha pasado mucho tiempo desde que trabajé en Java, pero leer algo sobre la función de clasificación me ayudará.


Use java.utils.Arrays:

public int getTheNumber(int[] factors) { int[] f = (int[])factors.clone(); Arrays.sort(f); return f[0]*f[(f.length-1]; }

O si quiere ser eficiente, evite toda la asignación de objetos simplemente haga el trabajo:

public static int getTheNumber(int[] array) { if (array.length == 0) throw new IllegalArgumentException(); int min = array[0]; int max = array[0]; for (int i = 1; i< array.length;++i) { int v = array[i]; if (v < min) { min = v; } else if (v > max) { max = v; } } return min * max; }


esto es del tipo de API de Java "

public void sort (lista de lista) Ordena la lista especificada en orden ascendente, según el orden natural de sus elementos. Todos los elementos en la lista deben implementar la interfaz Comparable. Además, todos los elementos en la lista deben ser mutuamente comparables (es decir, e1.compareTo (e2) no debe lanzar una ClassCastException para ningún elemento e1 y e2 en la lista). "

tiene que ver con la implementación de la interfaz Comparable


hay dos causas de esta excepción:

1

Arrays.asList(factors) devuelve una List<int[]> donde factors es una matriz int

2

Olvidaste agregar el parámetro tipo a:

ArrayList<Integer> f = new ArrayList(Arrays.asList(factors));

con:

ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(factors));

lo que resulta en un error en tiempo de compilación :

found : java.util.List<int[]> required: java.util.List<java.lang.Integer>


Arrays.asList(factors) devuelve una List<int[]> , no una List<Integer> . Como está haciendo una new ArrayList lugar de la new ArrayList<Integer> , no obtiene un error de compilación para eso, pero crea una ArrayList<Object> que contiene un int[] y luego, implícitamente, la lanza a ArrayList<Integer> . Por supuesto, la primera vez que intenta utilizar uno de esos "enteros" obtiene una excepción.