【问题标题】:Efficient way of retrieving data from the map in Java用Java从地图中检索数据的有效方法
【发布时间】:2016-07-14 10:26:55
【问题描述】:

当你有一个字符串键和 sortedSet 值的映射时。 SortedSet 值可能会在不同的键之间重复。假设您的字符串键是您将购买杂货或其他东西的日期,然后排序集将是您在该日期购买的物品。有没有一种方法可以有效地检索您购买特定商品的日期(即无需遍历每个键和 sortedSet 中的每个商品)?

【问题讨论】:

  • 嗯,你需要迭代键,给定当前设置,而不是值 - 你可以调用contains,最终调用@987654322 @在底层NavigableMap上。
  • 哦,是的。好主意。什么是更理想的设置?
  • 这真的取决于你的使用情况。一种方法是简单地反转映射:将项目作为键,将购买日期作为值。另一种(更扭曲的)方法是将购买日期“注入”为集合中每个项目的属性,但这似乎是多余的。真的取决于您最终需要哪些数据相关性。

标签: java dictionary collections


【解决方案1】:

对于普通的Map<String,SortedSet>,除了迭代键并在地图的值上调用contains 之外,您什么也做不了。

但是您可以实现自己的数据结构,该结构更适合您的需求。基本上,不费吹灰之力,您就可以实现自己的Map<String,SortedSet>,它在内部委托给两个映射——一个用于基本日期->项目映射,一个用于反向查找索引日期->项目。然后您可以实现所有需要的方法(例如,put 会将条目放入两个映射中)。

另外,看看这个答案:Bidirectional multi-valued map in Java

【讨论】:

    【解决方案2】:

    我刚刚在 Apache Commons Collections 库中阅读。我记得你可以在使用 Collections 库时拥有一个双向地图 (BidiMap)。

    定义一个允许键和值之间双向查找的映射。

    这个扩展的 Map 表示一个键可以查找一个值的映射 并且一个值可以同样容易地查找一个键。该接口扩展 地图等可以在任何需要地图的地方使用。界面 提供反向地图视图,实现对两个方向的完全访问 的 BidiMap。

    相关文档:https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/BidiMap.html

    该文档还显示了 Apache Commons 库中提供的两个已知实现,OrderedBidiMap<K,V>SortedBidiMap<K,V>

    【讨论】:

    • 再次阅读问题:OP 正在寻找基于值的键。在此处使用 Map.values 调用本身毫无意义。
    • 谢谢。基本上,这将描述基于值查找键的尝试:BidiMap
    • 现在更有意义了,但这个门槛可能有点过头了。如果 OP 只想获取给定项目的购买日期,那么也许他们应该通过使用 item -> purchase dates 来反转映射。有点模糊,无法确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2015-01-28
    • 2012-08-12
    • 2017-04-04
    相关资源
    最近更新 更多