Voici une autre façon de le faire. Cette approche ne nécessite pas de créer une deuxième copie du tableau, puisque Arrays.asList
produit simplement une vue supportée par le tableau du tableau donné. Un autre avantage potentiel est le fait que les signes du minimum et du maximum sont préservés. Dans l'exemple ci-dessous, le minimum est affiché à 1,333 et le maximum à -9,43.
Il est plus complexe que la solution de Stefan, mais en fonction de la situation, il pourrait être bon pour vous.
Float numbers[] = {-9.43f, 2.3f, -8.2f, 1.333f};
// Calculate the minimum
Float min = Collections.min(Arrays.asList(numbers),
new Comparator<Float>() {
public int compare(Float o1, Float o2) {
Float result = Math.abs(o1) - Math.abs(o2);
return result > 0 ? 1 : result < 0 ? -1 : 0;
}
}
);
// Calculate the maximum
Float max = Collections.min(Arrays.asList(numbers),
new Comparator<Float>() {
public int compare(Float o1, Float o2) {
Float result = Math.abs(o2) - Math.abs(o1);
return result > 0 ? 1 : result < 0 ? -1 : 0;
}
}
);
System.out.println("Min = " + min);
System.out.println("Max = " + max);
Sortie:
Min = 1.333
Max = -9.43
Edit: En réponse à "hatchetman82" dans les commentaires, j'ai décidé de lancer une référence simple pour voir comment ma solution par rapport à Stefan réalise Kendall. Pour les petits réseaux de moins de dix mille éléments, les deux solutions fonctionnent presque de la même manière. Cependant, pour les réseaux plus grands, ma solution fonctionnera généralement mieux.
approche de Stefan est tout à fait valable, mais il utilise environ deux fois plus de mémoire que la mienne, car il doit créer une copie du tableau d'origine afin de stocker la valeur absolue de chaque élément. En ce qui concerne la complexité temporelle, j'ai trouvé que mon approche se situait entre 4X et 7X plus vite, principalement en raison de l'approche de Stefan pour copier le tableau. Gardez à l'esprit que ces tests ont été effectués sur une seule machine (un MacBook Pro, 4 Go, Core2 Duo @ 2.53) et que les résultats varient en fonction des configurations de votre ordinateur et de la JVM.
L'approche de Stefan est certainement plus directe, et la mienne peut mieux fonctionner dans certaines situations. Donc, fondamentalement, chaque solution est valide, bien que l'un ou l'autre puisse être préférable selon la situation.
en python lambda n'est pas nécessaire, il suffit de faire carte (abs, ...) –
droite ... la privation de sommeil prend encore une fois son péage. –
Java ne peut pas obtenir des fermetures assez rapidement. –