Есть ли нечувствительный мультимап в коллекциях Google

StackOverflow https://stackoverflow.com/questions/4592612

  •  15-10-2019
  •  | 
  •  

Вопрос

Мне нужна мульти -карта, какая ключи нечувствительны. Есть ли такая реализация в коллекциях 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top