有没有一个好的方法有一个地图<string,?>得到并忽略大小写?
有没有一个好的方法有一个Map<String, ?>
得到并忽略大小写?
TreeMap扩展了Map并支持自定义比较器。
string提供了默认的不区分大小写的比较器。
所以:
final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
比较器不考虑语言环境。 在JavaDoc中阅读更多关于它的内容。
您可以使用Apache Commons Collections中的CaseInsensitiveMap 。
是否有可能实现你自己的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()); } }
这种方法不会强制你改变你的“键”types,而是你的Map实现。
你需要一个包装类,你的String键与不区分大小写的equals()和hashCode()实现。 用Map来代替string。
在http://www.java.happycodings.com/Java_Util_Package/code3.html上看到一个示例实现。我在2分钟内发现了它的search结果。; 看起来很明智,虽然我从来没有用过。
想到的三个明显的解决scheme:
-
在使用string作为关键字之前规范化情况(非土耳其语区域设置与世界其他地方不一样)。
-
使用专门devise用作键的对象types。 这是处理复合键的常见习惯用法。
-
使用一个不区分大小写的Comparator(可能是一个PRIMARY或SECONDARY强度java.text.Collator)的TreeMap。 不幸的是,Java库没有一个与hashCode / equals相当的Comparator对象。
你可以使用我在这里讨论的Apache许可的CaseInsensitiveMap 。 与Apache Commons版本不同,它保留了密钥的情况。 它比TreeMap更严格地执行地图合同(加上有更好的并发语义)(详见博客评论)。
Trove4j可以为HashMap使用自定义散列。 这可能会影响性能,因为hashcode不能被caching(虽然Trove4j可能已经find了解决办法)。 包装对象(如John M所描述的)没有这种caching缺陷。 另请参阅我的关于TreeMap的其他答案。
在下面的链接查看接受的答案。 如何检查地图中的密钥而不pipe情况如何?
底线是“最简单的解决scheme是在插入/检查之前简单地将所有input转换为大写(或小写),甚至可以编写自己的Map包装器,以确保一致性。