Comment puis-je représenter une gamme en Java?
Disons un entier doit être dans la plage: [0...2147483647]
Je veux vérifier si une variable de type entier se situe dans cette fourchette. Je sais que cela peut être accompli par un simple if-else, mais est-il un moyen plus efficace pour vérifier si il est dans la gamme?
Je préfère ne pas le faire:
if (foo >= 0 && foo <= 2147483647)
{
//do something
}
- Si vous vous posez la question pour l'exécution de l'efficacité (rendement), je crains que votre
if
déclaration de victoires. Je suis d'accord, cependant, que cette observation ne doit pas conduire votre décision. Pour 99% des applications, la maintenance de l'efficacité sera plus important. - J'irais même jusqu'à le simplifier pour
if(foo >= 0) …
, comme il n'y a pas besoin de vérifier si unint
est<=Integer.MAX_VALUE
à tous. Mais je doute que l'interlocuteur ne sera jamais lu ces commentaires, comme après cinq ans d'absence, le retour est calme rare.
Vous devez vous connecter pour publier un commentaire.
Apache Commons Lang a une
Gamme
de la classe pour faire arbitraire des plages.Goyave
Gamme
a les mêmes API.Si vous avez envie de vérifier si un numéro s'inscrit dans une longue valeur ou une valeur int, vous pouvez essayer de l'utiliser par le biais de
BigDecimal
. Il existe des méthodes pourlongValueExact
etintValueExact
que lancer des exceptions si la valeur est trop grande pour ces précisions..contains(...)
est mis en œuvre? 😉 (Avec un if/else pour sûr 🙂Vous pouvez créer une classe pour représenter cette
Exemple d'utilisation:
low <= high
). Soit l'intervalle doit être à demi-ouvert[low, high)
ou d'utiliser unextent
au lieu dehigh
.Je sais que c'est un assez vieux jeu, mais avec Java 8 du cours d'eau, vous pouvez obtenir une gamme de
int
s comme ceci:Ensuite, vous pouvez faire quelque chose comme ceci:
A
dans le meilleur des cas. D'autre part, vous avez seulement besoin de un de comparaison,A >= 0
ici.Si vous êtes à la vérification à l'encontre de beaucoup d'intervalles, je vous suggère d'utiliser un intervalle d'arbre.
Vous pouvez utiliser
java.time.temporal.ValueRange
qui acceptelong
et également de travailler avecint
:Vous aurez une si-vérifier n'importe comment efficace vous essayez d'optimiser ce pas-si-calcul intensif 🙂 Vous pouvez soustraire à la limite supérieure du nombre et si c'est positif, vous savez que vous êtes hors de portée. Vous pouvez peut-être effectuer certaines booléenne de décalage de bit logique de le comprendre, et vous pouvez même utiliser de Fermat si vous le souhaitez (une blague 🙂 Mais la question est "pourquoi" avez-vous besoin pour optimiser cette comparaison? Quel est le but?
Pour une gamme de
Comparable
j'utilise la suite :(C'est un peu court-circuité version. Le code complet est disponible ici )