有没有一个很好的方法来获得Map <string,?=“”> get和put ignore case?</string,>

时间:2008-10-17 15:07:03

标签: java map case-insensitive

有一个很好的方法让Map<String, ?>得到并放弃忽略案例吗?

8 个答案:

答案 0 :(得分:62)

TreeMap扩展了Map并支持自定义比较器。

String提供了一个默认的不区分大小写的比较器。

所以:

final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

比较器不考虑区域设置。在JavaDoc中阅读更多相关内容。

答案 1 :(得分:42)

您可以使用Apache的Commons Collections中的CaseInsensitiveMap

答案 2 :(得分:31)

是否可以实现自己的Map覆盖put / get方法?

public class CaseInsensitiveMap extends HashMap<String, String> {
    ...
    put(String key, String value) {
       super.put(key.toLowerCase(), value);
    }

    get(String key) {
       super.get(key.toLowercase());
    }
}

此方法不会强制您更改“密钥”类型,而是更改地图实施。

答案 3 :(得分:14)

您需要一个String键的包装类,它具有不区分大小写的equals()和hashCode()实现。使用它而不是Map的键的字符串。

查看http://www.java.happycodings.com/Java_Util_Package/code3.html的示例实现我在2分钟的谷歌搜索中找到了它。看起来对我很敏感,虽然我从未使用过它。

答案 4 :(得分:3)

想到的三个明显的解决方案:

  • 在使用String作为键之前规范化大小写(不是土耳其语语言环境与世界其他地方的工作方式不同)。

  • 使用旨在用作键的特殊对象类型。这是处理复合键的常用习惯用法。

  • 将TreeMap与不区分大小写的比较器(可能是PRIMARY或SECONDARY strength java.text.Collat​​or)一起使用。不幸的是,Java库没有与hashCode / equals等效的Comparator。

答案 5 :(得分:3)

您可以使用我所讨论的CaseInsensitiveMap的Apache许可here。与Apache Commons版本不同,它保留了密钥的情况。它比TreeMap更严格地实现了地图合约(加上具有更好的并发语义)(详见博客评论)。

答案 6 :(得分:0)

Trove4j可以为HashMap使用自定义哈希。然而,由于无法缓存哈希码(尽管Trove4j可能已经找到了解决这个问题的方法吗?),但这可能会对性能产生影响。包装器对象(如John M所述)没有此缓存缺陷。另请参阅我关于TreeMap的其他答案。

答案 7 :(得分:0)

在下面的链接中查看已接受的答案。 How to check for key in a Map irrespective of the case?

底线是“最简单的解决方案是在插入/检查之前简单地将所有输入转换为大写(或小写)。您甚至可以编写自己的Map包装器,以确保一致性。”