有没有一个很好的方法来获得Map <String,?> get和put ignore case?

Jos*_*hua 61 java map case-insensitive

是否有一个很好的方法来Map<String, ?>获得并放弃忽略案例?

vol*_*ley 62

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

String提供默认的不区分大小写的比较器.

所以:

final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)

比较器不考虑区域设置.在JavaDoc中阅读更多相关信息.

  • 请注意,如果您控制正在使用的密钥*而不是最终用户,并且您的密钥是英语,则无需担心区域设置*. (4认同)

Eri*_*nau 42

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

  • 从4.0版开始,Apache的Commons Collections是通用的. (5认同)

Gui*_*ido 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法不会强迫您更改"密钥"类型,而是使用Map实现.

  • 一个奇怪的副作用是,如果你列出这张地图中的键,它们会突然变成小写. (10认同)
  • 这基本上是Apache的Commons Collections CaseInsensitiveMap采用的方法. (4认同)
  • 记住在执行大写和小写操作时使用语言环境. (4认同)
  • 不要忘记覆盖所有其他"put"方法,例如putAll. (3认同)
  • 如果将其内容传输到另一个地图,请不要忘记containsKey和mind问题. (3认同)
  • 不喜欢扩展HashMap的想法,为什么不创建一个委托代码:CaseInsensitiveMap <V>实现Map <String,V>,并将Map <String,V>作为构造函数参数? (2认同)
  • 如果你将排球标记为已接受的答案,那就太棒了. (2认同)
  • 谨防在JDK8中这样做.实现已更改,您现在需要覆盖get,put和putAll以使其保持一致. (2认同)

Joh*_*n M 14

您需要一个String键的包装类,它具有不区分大小写的equals()和hashCode()实现.使用它代替Map的键的String.

请参阅http://www.java.happycodings.com/Java_Util_Package/code3.html上的示例实现. 我在2分钟的谷歌搜索中找到了它.虽然我从未使用它,但对我来说看起来很明智.