Есть ли нечувствительный мультимап в коллекциях Google
Вопрос
Мне нужна мульти -карта, какая ключи нечувствительны. Есть ли такая реализация в коллекциях Google?
Решение
Вот нечувствительная версия ForwardingMap
:
public class CaseInsensitiveForwardingMap<V> extends ForwardingMap<String, V>
implements Serializable{
private static final long serialVersionUID = -7741335486707072323L;
// default constructor
public CaseInsensitiveForwardingMap(){
this(new HashMap<String, V>());
}
// constructor with a supplied map
public CaseInsensitiveForwardingMap(final Map<String, V> inner){
this.inner = inner;
}
private final Map<String, V> inner;
@Override
protected Map<String, V> delegate(){
return inner;
}
// convert keys to lower case Strings, preserve null keys
private static String lower(final Object key){
return key == null ? null : key.toString().toLowerCase();
}
@Override
public V get(final Object key){ return inner.get(lower(key)); }
@Override
public void putAll(final Map<? extends String, ? extends V> map){
if(map == null || map.isEmpty()){ inner.putAll(map); }
else{
for(final Entry<? extends String, ? extends V> entry :
map.entrySet()){
inner.put(lower(entry.getKey()), entry.getValue());
}
}
}
@Override
public V remove(final Object object){ return inner.remove(lower(object)); }
@Override
public boolean containsKey(final Object key){
return inner.containsKey(lower(key));
}
@Override
public V put(final String key, final V value){
return inner.put(lower(key), value);
}
}
Используя эту карту, вы можете создать MultiMap
Использование методов поставщика в MultiMaps
.
Пример:
Map<String, Collection<String>> map =
new CaseInsensitiveForwardingMap<Collection<String>>();
Multimap<String, String> caseInsensitiveMultiMap =
Multimaps.newMultimap(map, new Supplier<Collection<String>>(){
@Override
public Collection<String> get(){ return Sets.newHashSet(); }
});
Предостережение: keySet()
Вернут только строчные значения, независимо от того, как были введены ключи.
Другие советы
Не могли бы вы использовать Map<String,List<Payload>>
и дай это Comparator<String>
Что сравнительно сравнивает случай?
Похоже, что ни сборы Google Collections, ни фреймворки коллекции Apache не имеют мультимапа, который принимает компаратор для оценки равенства ключа.
Вы можете определить нечувствительный к случаю строкового компаратора, используя Коллатор. Анкет Затем создайте TreeMultimap с клавишами, отсортированными этим компаратором.
Нет, но, по -видимому, вы используете струнные клавиши? Если так, почему бы просто не нормализовать весь доступ к обычной мультимапе? Для 80% случая, это будет делать все вызовы, и станет более строгим регистрацией.
Для полного обсуждения вопросов с нечувствительными к случаям мультимапам см. это обсуждение группы Google