Java 检查树映射是否包含对象,是否符合更一般的规范?

Java 检查树映射是否包含对象,是否符合更一般的规范?,java,treemap,Java,Treemap,假设我有一个TreeMap,其中MyDataType是一个包含字符串和长的对象。我想检查TreeMap是否包含具有特定字符串的键;但是,与对象关联的Long对我来说并不重要。例如,我的TreeMap可以如下所示: {MyDataType: ["Tom", 1L] -> 1, MyDataType: ["Billy", 3L] -> 1, MyDataType: ["Ryan", 8L] -> 1} 我想看看TreeMap是否包含一个MyDataType类型的键,其String

假设我有一个
TreeMap
,其中
MyDataType
是一个包含
字符串和
的对象。我想检查TreeMap
是否包含具有特定
字符串的键
;但是,与对象关联的
Long
对我来说并不重要。例如,我的
TreeMap
可以如下所示:

{MyDataType: ["Tom", 1L] -> 1, MyDataType: ["Billy", 3L] -> 1, MyDataType: ["Ryan", 8L] -> 1}
我想看看
TreeMap
是否包含一个
MyDataType
类型的键,其
String
值为“Billy”。我可以想出两种方法:

(1) 逐个遍历树映射,检查每个
MyDataType
键的
String
。 (2) 编写一个扩展
TreeMap
的新类,并编写一个新的
containsKeyWithStringValue(String toCheck)
,该类专门执行我希望它执行的操作


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

我会创建一个
树形图,将
“Tom”
直接映射到
2
“Billy”
5
,等等。

基本上,你是在问是否有更简洁的方法(不是更高效、更可扩展,等等)

我认为答案是否定的

  • 标准Java Map API不提供任何查询映射的机制。。。除了
    获取

  • Guava库支持函数式编程,包括过滤键、值和地图条目的功能;看见然而,当您包含实现一个Guava谓词所需的所有样板文件时,它是否比手工迭代和测试条目更简洁是值得怀疑的

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


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



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

因此,如果有两个树形图,请检查
树形图以查看
树形图`是否包含符合我规范的对象,然后再次使用原始的“树形图”用于任何其他用途?如果您想通过
字符串查找内容,那么,为什么要有一个
TreeMap
?你是否仍然有
TreeMap
取决于你自己的具体要求-具体来说,你是否仍然需要按整个
MyDataType
查找
整数。因为我想看看
字符串是否包含在TreeMap中,如果没有,我抛出一个异常。如果它包含在树映射中,我需要检查与它相关联的
MyDataType
中的
Integer
是否高于某个阈值。如果没有,我抛出一个异常。那么您需要map键中的
Long
做什么?为什么要使用树映射?地图条目的顺序重要吗?他们目前的订单是什么?