Trouver la valeur max/min dans un tableau de primitives à l'aide de Java
Il est trivial d'écrire une fonction pour déterminer le min/max de la valeur dans un tableau, comme:
/**
*
* @param chars
* @return the max value in the array of chars
*/
private static int maxValue(char[] chars) {
int max = chars[0];
for (int ktr = 0; ktr < chars.length; ktr++) {
if (chars[ktr] > max) {
max = chars[ktr];
}
}
return max;
}
mais n'est-ce pas déjà fait quelque part?
- Tableau de primitif à la gamme des récipients aider: stackoverflow.com/questions/3770289/..., suivi par
Collections.max(Arrays.asList())
.
Vous devez vous connecter pour publier un commentaire.
À l'aide de Communes Lang (convertir) + Collections (min/max)
Noter que
Arrays.asList()
enveloppe le tableau sous-jacent, de sorte qu'il ne devrait pas être trop gourmande en mémoire et il ne devrait pas effectuer une copie sur les éléments du tableau.ArrayUtils
Arrays.asList()
doit être fine, maisArrayUtils.toObject()
copie de chaque élément dea
à un nouveau tableau deCharacter
.Arrays.asList(a)
ne fonctionne pas. Vous ne pouvez pas faire une liste de primitives (List<char>
dans ce cas). Vous devez d'abord convertir les valeurs primitives à des objets et c'est pourquoiArrayUtils.toObject
est utilisé.Vous pouvez simplement utiliser le nouveau Java 8
Stream
s mais vous avez à travailler avecint
.La
stream
méthode de la classe utilitaireTableaux
vous donne unIntStream
sur lequel vous pouvez utiliser lamin
méthode. Vous pouvez également fairemax
,somme
,moyenne
,...La
getAsInt
méthode est utilisée pour obtenir la valeur de laOptionalInt
==Mise à JOUR==
Si le temps d'exécution est important et vous voulez aller à travers les données qu'une seule fois, vous pouvez utiliser le
summaryStatistics()
méthode comme ceciCette approche peut donner de meilleures performances que les classiques de la boucle parce que le
summaryStatistics
méthode est un réduction de fonctionnement et il permet la parallélisation.La Google Goyave bibliothèque a min et max des méthodes, dans ses Caractères, Entiers, Longs, etc. classes.
De sorte que vous pouvez simplement utiliser:
Aucune conversion n'est nécessaire et sans doute il est efficacement mise en œuvre.
Oui, c'est fait dans le Collections classe. Notez que vous aurez besoin de convertir votre primitif char tableau d'un Caractère[] manuellement.
Une courte démo:
char []
à unCharacter []
seulement pour déterminer le maximum est tout à fait inefficace - mieux créer une classe utilitaire avec des méthodes statiques pour chaque type primitif similaire àjava.util.Arrays
: java.sun.com/javase/6/docs/api/java/util/Arrays.htmlCharacter.valueOf(chars[i])
au lieu denew Character(chars[i])
pour des raisons de performances: java.sun.com/javase/6/docs/api/java/lang/...J'ai un peu de classe d'aide dans toutes mes applications avec des méthodes comme:
Vous pouvez facilement le faire avec un
IntStream
et lamax()
méthode.Exemple
Explication
range(0, intArray.length)
À obtenir un flux de données avec de nombreux éléments présent dans l'intArray
.map(i -> intArray[i])
- Carte de chaque élément du flux vers un réel élément de laintArray
.max()
- Obtenir le maximum d'élément de ce flux commeOptionalInt
.getAsInt()
- Déballer leOptionalInt
. (Vous pouvez également utiliser ici:orElse(0)
, juste au cas où leOptionalInt
est vide.)int
mais la question est de demander des valeurs primitivesint, long, char, byte....
Une solution avec
reduce()
:Dans le code ci-dessus,
reduce()
renvoie des données dansOptional
format, qui vous permet de convertirint
pargetAsInt()
.Si l'on veut comparer la valeur de max avec un certain nombre, on peut définir une valeur de départ dans
reduce()
:Dans le code ci-dessus, lorsque
reduce()
avec une identité (valeur de départ) comme premier paramètre, il renvoie les données dans le même format, avec l'identité. Avec cette propriété, nous pouvons appliquer cette solution à d'autres tableaux:Voici un utilitaire classe
min/max
méthodes pour les types primitifs: Primitives.javaExemple avec float:
Voici une solution pour obtenir la valeur max dans environ 99% de courses (changer de 0,01 à obtenir un meilleur résultat):
(Pas tout à fait sérieux)
Passer de la matrice à une méthode qui trie avec
Arrays.sort()
donc il ne trie le tableau de la méthode est d'utiliser définit ensuite min àarray[0]
et max àarray[array.length-1]
.La méthode de base pour obtenir le min/max de la valeur d'un Tableau. Si vous avez besoin de la non triés tableau, vous pouvez créer une copie ou passer à une méthode qui retourne le min ou max. Si non, tableau trié est mieux car il fonctionne plus rapidement dans certains cas.