Arrays.asList () de um array

O que há de errado com essa conversão?

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

Eu fiz isso depois de ler a solução encontrada em Create ArrayList from array . A segunda linha (sorting) em getTheNumber(...) causa a seguinte exceção:

Exceção no segmento “main” java.lang.ClassCastException: [não posso ser convertido em java.lang.Comparable]

O que está errado aqui? Eu percebo que a sorting poderia ser feita com Arrays.sort() , estou apenas curioso sobre isso.

Vamos considerar o seguinte exemplo simplificado:

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

Na linha println, isso imprime algo como “[[I @ 190d11]”, o que significa que você realmente construiu uma ArrayList que contém arrays int.

Seu IDE e compilador devem avisar sobre atribuições não verificadas nesse código. Você deve sempre usar o new ArrayList() ou o new ArrayList<>() vez do new ArrayList() . Se você tivesse usado, teria havido um erro de compilation por causa da tentativa de passar List para o construtor.

Não há autoboxing de int[] para Integer[] , e de qualquer forma o autoboxing é apenas um açúcar sintático no compilador, então neste caso você precisa fazer a cópia da matriz manualmente:

 public static int getTheNumber(int[] factors) { List f = new ArrayList(); 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); } 

Você está tentando converter int [] para Integer [], isso não é possível.

Você pode usar o ArrayUtils do commons-lang para converter os inteiros em Inteiros antes de obter a Lista do array:

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

há duas causas dessa exceção:

1

Arrays.asList(factors) retorna uma List onde os factors são um array int

2

você esqueceu de adicionar o parâmetro type a:

 ArrayList f = new ArrayList(Arrays.asList(factors)); 

com:

 ArrayList f = new ArrayList(Arrays.asList(factors)); 

resultando em um erro em tempo de compilation:

 found: java.util.List 
 obrigatório: java.util.List 

Use java.utils.Arrays:

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

Ou se você quiser ser eficiente, evite toda a alocação de objects, apenas faça o trabalho:

 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; } 

Eu acho que você encontrou um exemplo onde o auto-boxe não funciona. Como Arrays.asList(T... a) tem um parâmetro varargs, o compilador aparentemente considera o int [] e retorna um List com um único elemento nele.

Você deve mudar o método para isso:

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

e possivelmente adicionar isso para compatibilidade

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

Arrays.asList(factors) retorna uma List , não uma List . Já que você está fazendo um new ArrayList invés de um new ArrayList você não obtém um erro de compilation para isso, mas cria um ArrayList que contém um int[] e então converte implicitamente o arraylist para ArrayList . É claro que a primeira vez que você tenta usar um desses “Inteiros”, você recebe uma exceção.

Isso funciona do Java 5 a 7:

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

No Java 4 não há vararg … 🙂

isso é da API Java ”

public static void sort (Listar lista) Ordena a lista especificada em ordem crescente, de acordo com a ordenação natural de seus elementos. Todos os elementos da lista devem implementar a interface Comparable. Além disso, todos os elementos na lista devem ser mutuamente comparáveis ​​(ou seja, e1.compareTo (e2) não deve lançar uma ClassCastException para quaisquer elementos e1 e e2 na lista). ”

tem a ver com a implementação da interface Comparable

Tanto quanto eu entendo, a function de sorting na class de coleção só pode ser usada para classificar collections implementando a interface comparável.

Você está fornecendo uma matriz de inteiros. Você provavelmente deve envolver isso em torno de uma das classs Wrapper conhecidas, como Integer. Integer implementa comparável.

Tem sido um longo tempo desde que eu trabalhei em alguns Java sério, no entanto, lendo algum assunto sobre a function de tipo vai ajudar.