You need to use a Map
with
String
keys that will
ignore the capitalization of a key when
retrieving a value.
Use a
CaseInsensitiveMap
from the Commons Collections. This implementation of
Map
takes String
keys and
provides case-insensitive access. An entry with a key
“Test” can be retrieved with the
strings “TEST,”
“test,” and
“tEST.” Here is a small example
demonstrating the case insensitivity:
import java.util.*; import org.apache.commons.collection.map.CaseInsensitiveMap; Map grades = new CaseInsensitiveMap( ); grades.put( "Fortney", "B-" ); grades.put( "Puckett", "D+" ); grades.put( "Flatt", "A-" ); String grade1 = (String) grades.get( "puckett" ); String grade2 = (String) grades.get( "FLATT" );
In this example, the grades are stored with a capitalized last name, and the results are retrieved with irregularly capitalized last names. This example returns the grades for “Puckett” and “Flatt” even though they were retrieved with “puckett” and “FLATT.”
Example 5-12 demonstrates the use of
CaseInsensitiveMap
to access state names by state
abbreviations regardless of capitalization. This is useful when an
application is requesting a state from a user in a form to capture an
address. If a user enters “il,”
“IL,” or
“Il,” you need to be able to return
“Illinois.”
Example 5-12. Using a CaseInsensitiveMap for U.S. states
package com.discursive.jccook.collections.insensitive; import java.util.Map; import org.apache.commons.collections.map.CaseInsensitiveMap; public class CaseInsensitiveExample { Map states = new CaseInsensitiveMap( ); public static void main(String[] args) { CaseInsensitiveExample example = new CaseInsensitiveExample( ); example.start( ); } private void start( ) { states.put("IL", "Illinois"); states.put("PA", "Pennsylvania"); states.put("GA", "Georgia"); states.put("AZ", "Arizona"); String stateName = (String) states.get( "il" ); System.out.println( "Value retrieved for 'il': " + stateName ); stateName = (String) states.get( "IL" ); System.out.println( "Value retrieved for 'IL': " + stateName ); stateName = (String) states.get( "iL" ); System.out.println( "Value retrieved for 'iL': " + stateName ); } }
Example 5-12 populates a
CaseInsensitiveMap
with state abbreviations and
state names, and it retrieves the state name for three different
capitalizations of “IL”:
“iL,”
“IL,” and
“il.” For all three keys, the
CaseInsensitiveMap
returns the proper state
name—“Illinois”—as
illustrated by the output from the previous example:
Value retrieved for 'il': Illinois Value retrieved for 'IL': Illinois Value retrieved for 'iL': Illinois
If you are interested in how this class works, take a look at the
source for CaseInsensitiveMap
, and you will see
that this implementation of Map
extends the
AbstractHashedMap
class in the
org.apache.commons.collections.map
package. It
would be just as easy to decorate a Map
with a
Transformer
object to provide case insensitivity.
Recipe 5.16 discusses the use of a
Transformer
to
alter objects as they are stored in
a Collection
.
13.59.79.176