11

How can I implement

class CaseInsensitiveConcurrentMap<V> implements ConcurrentMap<String , V>

which works just like ConcurrentHashMap<String , V> except that the keys are compared case-insensitively? The keys should not be converted to lowercase or uppercase.

Note that Collections.synchronizedMap(new TreeMap<String, new MyCaseInsensitiveComparator()) is no solution as it allows no concurrency and misses the additional methods.

Creating a String-like class with case-insensitive equals and hashCode is no option either, since the map has to be passed to methods expecting strings as keys.

maaartinus
  • 44,714
  • 32
  • 161
  • 320

2 Answers2

15

Have you tried

ConcurrentMap<String, Object> map = 
    new ConcurrentSkipListMap<String, Object>(
        String.CASE_INSENSITIVE_ORDER);
Peter Lawrey
  • 525,659
  • 79
  • 751
  • 1,130
0

If you really insist on all your constraints (ConcurrentHashMap) and String keys:

Overwrite any ConcurrentHashMap method and convert any key with key = key.toLowerCase().

Looks like a lot of work, and a lot of unit testing, so if I were you I would try to discuss the interface.

Example:

@Overwrite
public void V get(String key) {
  return super.get(transform(key));
}

// Extracted that to avoid cluttering your whole code with that specific transformation
// So you can easily change it
private String transform(String key) {
  return key.toLowerCase();
}

Ugly, but, given your constraints, feasible.

Stefan Schubert-Peters
  • 5,419
  • 2
  • 20
  • 21