herpderp
herpderp

Reputation: 16177

How to check if an integer is in a given range?

Hoping for something more elegant than

if (i>0 && i<100) 

Upvotes: 117

Views: 358218

Answers (22)

Arpan Saini
Arpan Saini

Reputation: 5181

ValueRange

We can repurpose the java.time.temporal.ValueRange class found within the java.time framework built into Java 8+.

ValueRange range = java.time.temporal.ValueRange.of(minValue, maxValue);
range.isValidIntValue(x);

This code:

  • Returns true if minValue <= x <= MaxValue - i.e. within the range
  • Returns false if x < minValue or x > maxValue - i.e. out of range

Use with if condition as shown below:

int value = 10;
if (ValueRange.of(0, 100).isValidIntValue(value)) {
    System.out.println("Value is with in the Range.");
} else {
    System.out.println("Value is out of the Range.");
}

The below program checks, if any of the passed integer value in the hasTeen method is within the range of 13 (inclusive) to 19 (inclusive).


import java.time.temporal.ValueRange;
  
public class TeenNumberChecker {

    public static void main(String[] args) {
        System.out.println(hasTeen(9, 99, 19));
        System.out.println(hasTeen(23, 15, 42));
        System.out.println(hasTeen(22, 23, 34));
    }

    public static boolean hasTeen(int firstNumber, int secondNumber, int thirdNumber) {

        ValueRange range = ValueRange.of(13, 19);
        System.out.println("*********Int validation Start ***********");
        System.out.println(range.isIntValue());
        System.out.println(range.isValidIntValue(firstNumber));
        System.out.println(range.isValidIntValue(secondNumber));
        System.out.println(range.isValidIntValue(thirdNumber));
        System.out.println(range.isValidValue(thirdNumber));
        System.out.println("**********Int validation End**************");

        if (range.isValidIntValue(firstNumber) || range.isValidIntValue(secondNumber) || range.isValidIntValue(thirdNumber)) {
            return true;
        } else
            return false;
    }
}

OUTPUT

true as 19 is part of range

true as 15 is part of range

false as all three value passed out of range

Upvotes: 22

Asturio
Asturio

Reputation: 532

Ok, this is a quite old question, and there are many solutions. Here another one (you may decide if this is more elegant or not)

if (Math.max(lower, Math.min(value, higher)) == value)

in the example of the OP:

if (Math.max(0, Math.min(i, 100)) == i)

But I think this is so bulky like any other solution using a library.

Upvotes: 0

SasithM
SasithM

Reputation: 49

Wrote this program to check the value of 3 integer parameters against a range.

I have created a separate method to check the range of the each value using if/else-if statements.

I hope this helps someone.

public class TeenNumberChecker {

    public static void main(String[] args) {
        
        boolean isTeen = hasTeen();

    }

    public static boolean hasTeen(int valueOne, int valueTwo, int valueThree) {
        
        
        if (valueOne > 13 && valueOne < 19) {
            
            return true;
            
        } else if (valueTwo > 13 && valueTwo < 19) {
            
            return true;
            
        } else if (valueThree > 13 && valueThree < 19) {
            
            return true;
            
        }else {
            
            return false;
            
        }

    }
}

Upvotes: 0

Orwa Ogwari
Orwa Ogwari

Reputation: 151

Try this if strategy. Seems solid.

int num = 5;
    
    //random values; can be changed
    int a = 3;
    int b = 7;
    
    if (num >= 3 && num <= 7) {
        //Your Code Here
    }

Upvotes: 0

mcvkr
mcvkr

Reputation: 3912

Just my 2 cts

    // Exclusive    
    public boolean isOrdered(int n1, int n2, int n3) {
        return n1 < n2 && n2 < n3 ;
    }

call it like to see it is one of 1 to 99

    if (isOrdered(0,i,100)) 

Upvotes: 2

Maurice
Maurice

Reputation: 7381

if you are using Spring data you can also use the Range object from Spring.

range = new org.springframework.data.domain.Range(3, 8);
range.contains(5) // will return true.

Upvotes: 1

Ray Toal
Ray Toal

Reputation: 88378

If you just want to test whether the value of i is in the range [0..100), and you want the boolean result, then

i >= 0 && i < 100

is fine and will give you true or false. If you are willing to throw an exception if the value is out of range, you can use the built-in checkIndex method

Objects.checkIndex(i, 100)

which will throw IndexOutOfBoundsException if out of range. Granted, it is not a general solution, and is really only prettier if your context is one in which your range check is being done for checking array bounds, but it has the advantage of not needed any third party libraries, which is nice for small programs.

Upvotes: 0

p13rr0m
p13rr0m

Reputation: 1297

Google's Java Library Guava also implements Range:

import com.google.common.collect.Range;

Range<Integer> open = Range.open(1, 5);
System.out.println(open.contains(1)); // false
System.out.println(open.contains(3)); // true
System.out.println(open.contains(5)); // false

Range<Integer> closed = Range.closed(1, 5);
System.out.println(closed.contains(1)); // true
System.out.println(closed.contains(3)); // true
System.out.println(closed.contains(5)); // true

Range<Integer> openClosed = Range.openClosed(1, 5);
System.out.println(openClosed.contains(1)); // false
System.out.println(openClosed.contains(3)); // true
System.out.println(openClosed.contains(5)); // true

Upvotes: 4

VIVEK CHOUDHARY
VIVEK CHOUDHARY

Reputation: 546

 Range<Long> timeRange = Range.create(model.getFrom(), model.getTo());
    if(timeRange.contains(systemtime)){
        Toast.makeText(context, "green!!", Toast.LENGTH_SHORT).show();
    }

Upvotes: -1

Sahil Chhabra
Sahil Chhabra

Reputation: 11676

I think its already elegant way for comparing range. But, this approach cause you to write extra unit tests to satisfy all && cases.

So, you can use any of the below approach to avoid writing extra unit tests.

Using Java 8 Streams:

if(IntStream.rangeClosed(0,100).boxed().collect(Collectors.toList()).contains(i))

Using Math class:

if(Math.max(0, i) == Math.min(i, 100))

Personally I recommend the second approach because it won't end up creating an Array of the size equal to the range you want to check.

Upvotes: 13

Guru
Guru

Reputation: 2857

If you are confident that numbers are stored in 2's complement form:

return  ((x-low) <= (high-low));

A more general and safer solution would be:

return ((x-high)*(x-low) <= 0);

Upvotes: -2

SenthilRaja Natarajan
SenthilRaja Natarajan

Reputation: 15

if(i <= 0 || i >=100)

It will work.

Upvotes: -2

esin88
esin88

Reputation: 3199

If you're looking for something more original than

if (i > 0 && i < 100)

you can try this

import static java.lang.Integer.compare;
...
if(compare(i, 0) > compare(i, 100))

Upvotes: 5

beat
beat

Reputation: 2022

For those using commons lang an option is to use Range:

Range<Integer> myRange = Range.between(100, 500);
if (myRange.contains(200)){
    // do something
}

Also see: how to construct a apache commons 3.1 Range<Integer> object

Upvotes: 65

velis
velis

Reputation: 10025

This guy made a nice Range class.

Its use however will not yield nice code as it's a generic class. You'd have to type something like:

if (new Range<Integer>(0, 100).contains(i))

or (somewhat better if you implement first):

class IntRange extends Range<Integer>
....
if (new IntRange(0,100).contains(i))

Semantically both are IMHO nicer than what Java offers by default, but the memory overhead, performance degradation and more typing overall are hadly worth it. Personally, I like mdma's approach better.

Upvotes: 4

Vitaly
Vitaly

Reputation: 2662

I think

if (0 < i && i < 100) 

is more elegant. Looks like maths equation.

If you are looking for something special you can try:

Math.max(0, i) == Math.min(i, 100)

at least it uses library.

Upvotes: 40

Vishal Tathe
Vishal Tathe

Reputation: 190

Use this code :

if (lowerBound <= val && val < upperBound)
or
if (lowerBound <= val && val <= upperBound)

Upvotes: 2

Endi
Endi

Reputation: 40

Try:

if (i>0 && i<100) {} 

it will work at least ;)

Upvotes: 0

irreputable
irreputable

Reputation: 45433

if ( 0 < i && i < 100)  

if ( 'a' <= c && c <= 'z' )

Upvotes: 3

mdma
mdma

Reputation: 57707

I don't see how that's not elegant, but if you repeat the expression often, then it's a good idea to put it into a method, e.g.

class MathUtil
{
   public static boolean betweenExclusive(int x, int min, int max)
   {
       return x>min && x<max;    
   }
}

This is particularly true if you mix exclusive and inclusive comparisons. The method name can help avoid typos, such as using < when <= should have been used. The method can also take care of ensuring that min < max etc..

Upvotes: 8

Borealid
Borealid

Reputation: 98469

That's how you check is an integer is in a range. Greater than the lower bound, less than the upper bound. Trying to be clever with subtraction will likely not do what you want.

Upvotes: 0

Jakub Hampl
Jakub Hampl

Reputation: 40533

You could add spacing ;)

if (i > 0 && i < 100) 

Upvotes: 264

Related Questions