带有null键的Java不区分大小写的映射

时间:2018-01-02 17:12:00

标签: java collections null case-insensitive

在Java中是否存在使用不区分大小写的字符串匹配的 但也支持空键的Map实现? 我知道

new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER)

支持不区分大小写的String键匹配,但它不支持null键。

3 个答案:

答案 0 :(得分:30)

如果您使用的是Java 8,则以下内容将创建一个与null兼容,不区分大小写的TreeMap

Comparator<String> cmp = Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER);
TreeMap<String, String> map = new TreeMap<>(cmp);

无需外部库。

答案 1 :(得分:7)

您可以使用CaseInsensitiveMap。这将满足您的要求。 它不区分大小写,并且支持null键。

来自文档

  
    

不区分大小写的地图。在将键添加到地图或与其他现有键进行比较之前,它们将转换为a中的全部小写     通过使用Unicode数据中的信息,与语言环境无关的方式     文件。

  
     

支持空密钥。

     

keySet()方法返回所有小写的键,或空值。

答案 2 :(得分:5)

如果您不想使用外部库,可以为String.CASE_INSENSITIVE_ORDER创建自己的包装器,以可预测的方式对null进行排序:

 NavigableMap<String,String> m = new TreeMap(
    new Comparator<String>() {
        public int compare(String s1, String s2) {
            if (s1 == null && s2 == null) return 0;
            if (s1 != null && s2 != null) {
                return String.CASE_INSENSITIVE_ORDER.compare(s1, s2);
            }
            return s1 == null ? -1 : 1;
        }
    }
 );

Demo.