38 votes

Arrays.asList () d'un tableau

Quel est le problème avec cette conversion?

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

J'ai fait cette après la lecture de la solution trouvée dans la Façon de créer ArrayList (ArrayList<T>) de la matrice (T[]) en Java. La deuxième ligne (tri) en getTheNumber(...) provoque l'exception suivante:

Exception in thread "main" java.lang.ClassCastException: [je ne peux pas être jeté à java.lang.Comparable]

Quel est le problème ici? Je me rends compte que le tri peut être fait avec Arrays.sort(), je suis juste curieux au sujet de celui-ci.

42voto

Esko Luontola Points 53877

IntelliJ IDEA est inspections de donner une explication:

alt text

Au println ligne il imprime quelque chose comme "[[I@190d11]", ce qui signifie que vous avez construit une ArrayList qui contient int tableaux.

Il y a aussi un décoché affectation. Vous devez utiliser new ArrayList<Integer>() au lieu de new ArrayList(). Si vous aviez utilisé, il y aurait eu une erreur de compilation car d'essayer de passer List<int[]> pour le constructeur.

Il n'est pas l'autoboxing int[] pour Integer[], et de toute façon l'autoboxing est uniquement sucre syntaxique dans le compilateur, dans ce cas, vous devez faire le tableau de copier manuellement:

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

9voto

Rich Seller Points 46052

Vous essayez de convertir int [] en Integer [], cela n’est pas possible.

Vous pouvez utiliser ArrayUtils de commons-lang pour convertir les ints en entiers avant d'obtenir la liste du tableau:

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

8voto

dfa Points 54490

il y a deux causes de cette exception:

1

Arrays.asList(factors) renvoie un List<int[]>factors est un tableau int

2

vous avez oublié d'ajouter le paramètre type à:

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

avec:

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

résultant en une erreur de compilation :

trouvé: java.util.List <int []>
requis: java.util.List <java.lang.Integer>

6voto

Tom Points 13036

Utilisez java.utils.Arrays:

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

Ou bien, si vous voulez être efficace, évitez toute l’allocation d’objets et faites simplement le travail:

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

2voto

sepp2k Points 157757

Arrays.asList(factors) renvoie un List<int[]> , pas un List<Integer> . Puisque vous faites new ArrayList au lieu de new ArrayList<Integer> vous n'obtenez pas d'erreur de compilation pour cela, mais créez un ArrayList<Object> qui contient un int[] et vous lancez implicitement cet artiste en ArrayList<Integer> . Bien sûr, la première fois que vous essayez d'utiliser l'un de ces "Entiers", vous obtenez une exception.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X