开发者

How to make a CaseInsensitiveConcurrentMap?

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.


Have you tried

ConcurrentMap<String, Object> map = 
    new ConcurrentSkipListMap<String, Object>(
        String.CASE_INSENSITIVE_ORDER);


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜