0

所以说我有一个TreeMap<MyDataType, Integer>,其中MyDataType一个包含 aString和 a的对象Long。我想检查 TreeMapcontains是否具有某个键String;但是,Long与对象相关联对我来说并不重要。例如,我的TreeMap可能看起来像这样:

{MyDataType: ["Tom", 1L] -> 1, MyDataType: ["Billy", 3L] -> 1, MyDataType: ["Ryan", 8L] -> 1}

我想看看是否包含一个值为“Billy”TreeMap的键(类型MyDataType) 。String我可以想到两种方法来做到这一点:

(1) 一个一个地遍历TreeMap,检查String每个MyDataTypekey的。(2)编写一个扩展的新类,TreeMap<MyDataType, Integer>并编写一个containsKeyWithStringValue(String toCheck)专门做我想做的事的新类。

还有其他更简洁的方法吗?

4

2 回答 2

2

我会创建一个直接TreeMap<String, Integer>映射到、到等。"Tom"2"Billy"5

于 2013-06-28T22:05:54.400 回答
0

基本上,您是在问是否有更简洁的方法来执行此操作(不是更高效、更可扩展等)

我认为答案是否定的。

  • 标准 Java Map API 不提供任何用于查询地图的机制……除了get.

  • Guava 库支持函数式编程,包括过滤 Map 的键、值和条目的东西;看这里。但是,当您包含实现 Guava 谓词所需的所有样板文件时,它是否会比手动迭代和测试条目更简洁,这是值得怀疑的

您还需要在“未命中”时引发异常;即当字符串/整数不匹配条目时。有了这个约束,答案肯定是否定的。集合 API 通常被定义为null在“未命中”时返回,因为在 Java 中创建和抛出异常相对昂贵。


在 Java 8 中,第一部分的答案可能会发生变化,因为新的 lambda 和相关特性将使函数式编程更容易。但这不能满足您的要求,即未命中应导致异常。


最后,我不喜欢您TreeMap使用自定义方法进行扩展的想法。我认为您应该包装该类,或者将“扩展功能”实现为静态辅助方法。这不是客观原因,但在这种情况下,扩展对我来说确实“感觉不错”。

于 2013-06-29T02:43:12.620 回答