检查TreeMap是否包含对象,是否符合更一般的规范?

时间:2013-06-28 22:04:11

标签: java treemap

所以说我有一个TreeMap<MyDataType, Integer>,其中MyDataType是一个包含StringLong的对象。我想检查TreeMap contains是否具有某个String的密钥;但是,与对象关联的Long对我来说无关紧要。例如,我的TreeMap可能如下所示:

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

我想查看TreeMap是否包含MyDataType值为“Billy”的密钥(String类型)。我可以想到两种方法:

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

基本上,你问的是否有更强的简洁方式(不是更高效,更具可扩展性,等等)

我认为答案是肯定的。

  • 除了get之外,标准Java Map API不提供任何查询地图的机制。

  • Guava库包括对功能样式编程的支持,包括用于过滤键的值,值和Map的条目;见here。但是,当您包含实现Guava谓词所需的所有样板时,怀疑它比手动迭代和测试条目更简洁。

您还要求在“未命中”时抛出异常;即当String / Integer与条目不匹配时。使用该约束,答案肯定是否定的。如果存在“未命中”,则通常将收集API定义为返回null,因为在Java中创建和抛出异常相对昂贵。


使用Java 8,第一部分的答案可能会改变,因为新的lambda和相关功能将使函数式编程更容易。但这并不能解决您的错误导致异常的要求。


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