java - 谷歌 Collection 中是否有不区分大小写的多图

标签 java guava multimap

我需要一个多映射,其中的键不区分大小写。谷歌 Collection 中有这样的实现吗?

最佳答案

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

使用此 map ,您可以使用 MultiMaps 中的供应商方法创建 MultiMap .

例子:

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() 将只返回小写值,无论键是如何输入的。

关于java - 谷歌 Collection 中是否有不区分大小写的多图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4592612/

相关文章:

java - 如何访问网格 Pane 中的控件?

spring-boot - Spring Boot/Gradle/Querydsl项目有相同的依赖依赖不同版本的另一个依赖

java - 将 ListIterator 限制为前 N 个元素(优化)

java - 同步对 ConcurrentMap 中给定键的访问

c++ - 更改无序 multimap 中的键

c++ - 包含对的 multimap ?

java - j_security_check - 可以为表单提交传递额外的参数吗?

java - JAVA 8 中的 NULL 安全对象检查

java - 双向多图等效数据结构

java - 使用 Java 的 Jira Rest API