Common Java Cookbook

Edition: 0.19

Download PDF or Read on Scribd

Download Examples (ZIP)

8.3. Using Number Ranges

8.3.1. Problem

You need to define a range of acceptable values for a variable, and test to see if that variable is within those boundaries.

8.3.2. Solution

Use an implementation of Range, an interface that defines a simple numerical range. There are a number of different implementations for different types: NumberRange , DoubleRange , FloatRange , IntRange , and LongRange . The following example demonstrates the use of DoubleRange to verify that a variable is within a valid range. A DoubleRange is created with minimum and maximum values, and a value is tested by DoubleRange using a method named containsDouble( ) :

import org.apache.commons.lang.math.DoubleRange;
import org.apache.commons.lang.math.Range;
Range safeSpeed = new DoubleRange( 0.0, 65.0 );
double currentSpeed = getCurrentSpeed( );
if( !safeSpeed.containsDouble( currentSpeed ) ) {
    System.out.println( "Warning, current speed is unsafe." );
}

8.3.3. Discussion

Additionally, one can also test to see if another Range is contained within a Range, or if a Range overlaps another Range. The following example demonstrates the use of containsRange( ) to determine if a Range is entirely contained within another Range:

import org.apache.commons.lang.math.Range;
import org.apache.commons.lang.math.IntRange;
import org.apache.commons.lang.math.NumberUtils;
double recordHigh = getRecordHigh( );
double recordLow = getRecordLow( );
IntRange recordRange = new IntRange( recordLow, recordHigh );
int todayTemp = getTodaysMaxTemp( );
IntRange daysRange = new IntRange( NumberUtils.min( todayTemp ),
                                   NumberUtils.max( todayTemp ) );
if( !recordRange.containsRange( todayTemp ) ) {
    System.out.println( "Today is a record temperature day!" );
}

The previous code creates a Range, recordRange, from the record high and low temperatures. It then creates daysRange, which is a Range of the current day's high and low temperatures. If dayRange is not entirely contained within the recordRange, then the current day contains a record temperature and recordRange.containsRange(daysRange) will return false. containsRange( ) returns true if every value in the containing range occurs in the contained range, and overlapsRange( ) returns true if two Range objects share any common value. NumberUtils is used to retrieve the maximum and minimum values from the todayTemp array.

In another example, a Range object is used to ascertain the state of an element from a temperature measurement. Elemental Gold (Au) melts at 1337.33 Kelvin and boils at 3129.15 Kelvin. The following code is used to read the temperature from a thermometer and print the current state of the element:

import org.apache.commons.lang.math.Range;
import org.apache.commons.lang.math.DoubleRange;
double melting = 1337.33;
double boiling = 3129.15
// State ranges for element Au
Object[] stateRanges = 
    new Object[][]{{"solid" , new DoubleRange( 0.0, melting )},
                    {"liquid", new DoubleRange( melting, boiling )},
                    {"gas", new DoubleRange( boiling,Double.INFINITY) };
// Read measurement from thermometer
double temp = themometer.getReading( );
String state = "unknown";
// Test the state 
for( int i = 0; i < stateRanges.length; i++ ) {
    DoubleRange stateRange = (DoubleRange) stateRanges[i][1];
    if( stateRange.contains( temp ) ) {
        state = (String) stateRanges[i][0];
    }
}
System.out.println( "The substance is in a " + state + " state." );
// If the temperature is a temperate 293 K, this line would print 
// "The Gold is in a solid state."

The ranges in this example overlap; the solid range ends at melting, and the liquid range begins at melting. Because each Range is tested in a defined order, each Range object in this example is lower- and upper-bound inclusive. If the temp variable has the same value as melting, the program will indicate solid state, and if the temp variable has the same value as boiling, this program will signify the liquid state.

8.3.4. See Also

For more information about downloading Commons Lang, see Recipe 1.1.


Creative Commons License
Common Java Cookbook by Tim O'Brien is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License.
Permissions beyond the scope of this license may be available at http://www.discursive.com/books/cjcook/reference/jakartackbk-PREFACE-1.html. Copyright 2009. Common Java Cookbook Chunked HTML Output. Some Rights Reserved.