[Java] Vérification de la plage qui ne nécessite pas de comparaison

Comment implémentez-vous la vérification des plages?

La vérification de la plage de nombres et de caractères est souvent écrite avec une combinaison de ʻobj.compareTo (valeur) . Mais je ne me souviens tout simplement pas du modèle de la valeur de retour de compareTo ... Tout ce dont je me souviens, c'est que la correspondance est "0". Je l'exécute à chaque fois pour vérifier lequel est plus petit / plus grand, > 0 ou <0` ... Cependant, il y avait un moyen d'éviter d'écrire une vérification de plage «au-dessus de la valeur minimale et en dessous de la valeur maximale» en utilisant la méthode compareTo et les opérateurs d'égalité / inégalité.

Après tout, Apache Commons est excellent

La classe «org.apache.commons.lang3.Range» (qui existe depuis un certain temps mais qui était ignorante) a été le sauveur de Ponkotsu SE ... Je peux le deviner. Si vous recherchez sur Google avec "java range check", la mise en œuvre par les opérateurs d'égalité et d'inégalité et compareTo est en haut des résultats de recherche, vous ne pouvez donc pas y accéder facilement à moins de concevoir un peu de "communs" ou de mots-clés, non? ..

Exemple de code

int num0 = 0;
int num1 = 1;
int num2 = 2;

//Créer un objet de plage
Range rng = Range.between(num0, num2);

System.out.println("Vérifier à portée(" + num1 + ") = " + rng.contains(num1));
System.out.println("Vérifier à portée(" + -1 + ") = " + rng.contains(-1));

//Avec Range, vous pouvez faire plus que simplement vérifier la gamme.
System.out.println("Portée minimale= " + rng.getMinimum() + ", Portée maximale= " + rng.getMaximum());
System.out.println("Vérifiez si la plage est après l'argument(" + -1 + ") = " + rng.isAfter(-1));
System.out.println("Vérifiez si la plage est après l'argument(" + num0 + ") = " + rng.isAfter(num0));

//Il peut s'agir d'une chaîne de méthodes sans la stocker dans une variable
System.out.println("Vérifier à portée(" + num1 + ") = " + Range.between(num0, num2).contains(num1));

Résultat d'exécution

Vérifier à portée(1) = true
Vérifier à portée(-1) = false
Portée minimale=0, portée maximale= 2
Vérifiez si la plage est après l'argument(-1) = true
Vérifiez si la plage est après l'argument(0) = false
Vérifier à portée(1) = true

En plus de l'exemple ci-dessus, diverses méthodes telles que ʻisBefore et ʻelementCompareTo qui renvoient une valeur de retour comme compareTo sont implémentées. À propos, si les valeurs minimale et maximale de between ne correspondent pas, une erreur de compilation se produira, et si l'une d'elles est nulle, une IllegalArgumentException se produira. De plus, quel que soit l'ordre des valeurs minimales et maximales passées entre, la plage est définie correctement même avec «entre (valeur maximale, valeur minimale)». (Les valeurs de getMaximum et getMinimum ne se réduisent pas) Si le type de la plage ne correspond pas au type de l'argument contient, une exception ClassCastException se produit.

Avantages des génériques

La classe Range est géniale simplement parce que c'est une rupture avec compareTo, mais ce n'est pas la seule bonne chose. L'exemple ci-dessus était un type int de primitive (aucune conversion en Integer n'est requise), mais par exemple, vous pouvez passer un type de chaîne de caractères ainsi qu'un type de date ou d'heure! Gamme Je t'aime vraiment.

//Type de date(LocalDate)Échantillon
LocalDate ld0 = LocalDate.now().minusDays(1);
LocalDate ld1 = LocalDate.now();
LocalDate ld2 = LocalDate.now().plusDays(1);

Range rng = Range.between(ld0, ld2);
System.out.println(rng.contains(ld0)); // true
System.out.println(rng.contains(ld1)); // true
System.out.println(rng.contains(ld2)); // true
System.out.println(rng.contains(ld2.plusDays(1))); // false
System.out.println(rng.isAfter(ld0.minusDays(1))); // true
System.out.println(rng.contains(null)); // false

Je voulais savoir plus tôt ... c'est le plus haut ...

Vous pouvez également passer un objet de classe Comparator entre, afin de pouvoir comparer vos propres objets. Vraiment le meilleur des meilleurs. Je sens que l'état du ponkotsu est un peu amélioré.

Je ne pense pas qu'il y ait autant de SE Ponkotsu qui ne se souviennent pas de la valeur de retour de compareTo, mais je pense que c'est plus facile à comprendre en utilisant la classe Range. Avec contains, vous n'avez même pas besoin d'un opérateur logique. Par conséquent, j'aimerais que vous utilisiez la classe Range pour l'implémentation de la vérification de plage à l'avenir.

Recommended Posts

[Java] Vérification de la plage qui ne nécessite pas de comparaison
[Java] compareTo
La comparaison Java Integer (==) ne fonctionne pas correctement
Eclipse ne démarre pas après l'installation de Java 11
Vérification de la version Java
Processus de vérification Java