53 votes

Comment représenter une plage en Java ?

Disons qu'un nombre entier doit être compris dans l'intervalle : [0...2147483647]

Je souhaite vérifier si une variable entière est comprise dans cet intervalle. Je sais que cela peut être réalisé par une simple instruction if-else, mais existe-t-il un moyen plus efficace de vérifier si elle est comprise dans l'intervalle ?

Je préfère ne pas le faire :

if (foo >= 0 && foo <= 2147483647) 
{
    // do something
}

66voto

pimaster Points 979

Apache Commons Lang dispose d'une Range classe pour obtenir des plages arbitraires.

Range<Integer> test = Range.between(1, 3);
System.out.println(test.contains(2));
System.out.println(test.contains(4));

Goyave Range a une API similaire.

Si vous souhaitez simplement vérifier si un nombre correspond à une valeur longue ou à une valeur int, vous pouvez essayer de l'utiliser par le biais de BigDecimal . Il existe des méthodes pour longValueExact y intValueExact qui lèvent des exceptions si la valeur est trop grande pour ces précisions.

25voto

ScArcher2 Points 22118

Vous pourriez créer une classe pour représenter cela

public class Range
{
    private int low;
    private int high;

    public Range(int low, int high){
        this.low = low;
        this.high = high;
    }

    public boolean contains(int number){
        return (number >= low && number <= high);
    }
}

Exemple d'utilisation :

Range range = new Range(0, 2147483647);

if (range.contains(foo)) {
    //do something
}

18voto

clementi Points 172

Je sais qu'il s'agit d'une vieille question, mais avec les flux de Java 8, vous pouvez obtenir une plage de int est comme ceci :

// gives an IntStream of integers from 0 through Integer.MAX_VALUE
IntStream.rangeClosed(0, Integer.MAX_VALUE); 

Vous pouvez alors procéder de la manière suivante :

if (IntStream.rangeClosed(0, Integer.MAX_VALUE).matchAny(n -> n == A)) {
    // do something
} else {
    // do something else 
}

8voto

tskuzzy Points 19279

Si vous vérifiez un grand nombre d'intervalles, je vous suggère d'utiliser une fonction arbre à intervalles .

6voto

c0der Points 6996

Vous pouvez utiliser java.time.temporal.ValueRange qui accepte long et travaillerait également avec int :

int a = 2147;

//Use java 8 java.time.temporal.ValueRange. The range defined
//is inclusive of both min and max 
ValueRange range = ValueRange.of(0, 2147483647);

if(range.isValidValue(a)) {
    System.out.println("in range");
}else {
    System.out.println("not in range");
}

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