java获取map大小_关于java:是否有一个好的方法来获取Map

本问题已经有最佳答案,请猛点这里访问。

有什么好办法让Map获取并忽略大小写吗?

类似的问题:stackoverflow.com/questions/8236945/

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

字符串提供默认的不区分大小写的比较器。

所以:

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

比较器不考虑区域设置。在其JavaDoc中阅读有关它的更多信息。

请注意,如果您控制使用的密钥而不是最终用户,则不必担心语言环境,并且您的密钥是英语。

如果您需要一个Map,它不支持TreeMap不支持的空值,请尝试访问github.com/jdereg/java-util上的CaseInsenstiveMap。这与O(log n)的TreeMap不同,在O(1)中访问Map。

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

请注意,CaseInsensitiveMap不是通用的,因此您不能对此执行Map。

从4.0版开始,Apaches Commons Collections是通用的。

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

public class CaseInsensitiveMap extends HashMap {

...

put(String key, String value) {

super.put(key.toLowerCase(), value);

}

get(String key) {

super.get(key.toLowercase());

}

}

这种方法不会强迫您更改"键"类型,而是会更改Map实现。

这基本上是Apache Commons Collections CaseInsensitiveMap中采用的方法。

进行大写和小写操作时,请记住使用语言环境。

不要忘记重写所有其他" put"方法,例如putAll。

一个奇怪的副作用是,如果您在此地图中列出了按键,则它们会突然变成小写字母。

不喜欢扩展HashMap的想法,为什么不做这样的委托人:CaseInsensitiveMap ,它实现Map ,并且需要Map 作为构造函数参数?

如果将其内容转移到另一个地图中,请不要忘记containsKey和思维问题。

如果将齐射标记为可接受的答案,那就太好了。

当心在JDK8中执行此操作。实现已更改,您现在需要覆盖get,put和putAll,以使其保持一致。

请在此警告用户有关语言环境敏感的toLowercase()问题的危险!

您需要使用不区分大小写的equals()和hashCode()实现的String键包装类。使用它而不是字符串作为地图的键。

请参阅http://www.java.happycodings.com/Java_Util_Package/code3.html上的示例实现。我在谷歌搜索的2分钟后发现了它。对我来说似乎很明智,尽管我从未使用过它。

有点棘手,不是吗?如果不真正需要,我不喜欢实现equals和hashCode。我更喜欢创建Map实现而不是put和get方法的方法。

创建包装器类的过程一直都在进行,一点也不棘手。包装器类解决方案也比覆盖put,get,putAll更为整洁。您可以在任何基于散列或等号的集合(HashSet,HashMap,ArrayList等)上使用包装器类。

不同集合之间的可移植性很有趣。谢谢。我没有考虑过。我想每种方法都有其优点和缺点。

使用包装器类的另一个很好的理由是,如果您想保留字符串的原始大小写,则不可能通过覆盖put来做到这一点。

您可以使用此处讨论的我的Apache许可的CaseInsensitiveMap。与Apache Commons版本不同,它保留键的大小写。它比TreeMap更严格地实现地图协定(加上具有更好的并发语义)(有关详细信息,请参见博客评论)。

想到的三个显而易见的解决方案是:

在将字符串用作键之前,请对大小写进行规范化(土耳其语区域设置与世界其他地区的工作方式不同)。

使用设计为用作键的特殊对象类型。这是处理复合键的常见用法。

将TreeMap与不区分大小写的Comparator(可能是PRIMARY或SECONDARY强度的java.text.Collat??or)一起使用。不幸的是,Java库没有适用于hashCode / equals的Comparator等效项。

在下面的链接中查看接受的答案。

大小写如何检查地图中的键?

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

Trove4j可以对HashMap使用自定义哈希。但是,由于无法缓存哈希码,因此这可能会对性能产生影响(尽管Trove4j可能已找到解决方法?)。包装对象(如John M所述)没有这种缓存不足。另请参阅有关TreeMap的其他答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值