谷歌收藏中是否存在不区分大小写的多图

osh*_*hai 5 java multimap guava

我需要一个多地图,哪些键不区分大小写.谷歌收藏中有这样的实现吗?

Sea*_*oyd 9

这是一个不区分大小写的版本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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此映射,您可以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(); }

  });
Run Code Online (Sandbox Code Playgroud)

警告:keySet()只会返回小写值,无论键输入的方式如何.

  • 请注意,最好使用String.toUpperCase而不是String.toLowerCase,因为某些字符在大写时会映射到多个字符,但在小写时则不会.例如,字符`\ u00df`映射到大写的`\ u0053\u0053`,而`\ u0053\u0053`映射到小写的`\ u0073\u0073`.但显然`\ u00df`与`\ u0073\u0073`不一样,而在语义上却是如此. (3认同)

Dav*_*ock 5

难道你不能使用a Map<String,List<Payload>>并给它一个Comparator<String>不区分大小写的比较吗?

似乎Google Collections和Apache Collection框架都没有接受Comparator来评估密钥相等性的多图.

  • 使用[MultiMaps.newListMultiMap()](http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multimaps.html#newListMultimap%28java.util.Map%2C%20com .google.common.base.Supplier%29)并提供带有自定义比较器的`TreeMap` (3认同)