有一个很好的方法让Map<String, ?>
得到并放弃忽略案例吗?
答案 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.Collator)一起使用。不幸的是,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包装器,以确保一致性。”