【问题标题】:Getting Java Collections Binary Search to return multiple values获取 Java 集合二进制搜索以返回多个值
【发布时间】:2012-08-06 03:27:17
【问题描述】:

我想知道是否有任何方法可以让 Java 中的二进制搜索返回一个值的多个实例。例如,我有一个项的 ArrayList,其中一个字段是关键字的字符串数组。有没有比使用 contains() 方法通过关键字检索项目并将它们存储在单独的集合中的线性搜索更快的方法?还是通过 Author 等字符串?

...Item...
private String[] keywords;
private String author;
...

【问题讨论】:

  • 你能更准确一点吗?一次调用中的多个值...您可能需要编写一个包装器,将输出存储在一个数组中并返回它。
  • 要么在一个调用中,或者我想使用多个调用和某种返回的标志?
  • 请把问题说清楚

标签: java collections binary-search


【解决方案1】:

您几乎肯定希望对同一个集合有不同的看法。例如,您可以:

  • 所有项目中的List<Book>
  • Multimap<String, Book> 用于“按作者”查找
  • Multimap<String, Book> 用于“按关键字”查找(同一本书可以出现在多个条目中)

如果我在写这篇文章,Multimap 可能是Guava 中的一个实现,但也可以使用其他实现。

当然,这是假设您真的想要避免线性扫描。您的代码需要扩展多少?

【讨论】:

  • 好的,这就是我的想法,也是我试图避免的。我只是不确定是否有解决方法。谢谢
  • @Jon 你肯定在周日早起。 ;)
  • @PeterLawrey:我有孩子,我的妻子在指导营:)
  • 哈哈。正是我的想法。我最小的4.5岁。我猜你的年龄稍微小一点。 ;)
  • @PeterLawrey:不,我的是 8 岁、6 岁和 6 岁……但他们仍然早上 7 点起床。
【解决方案2】:

虽然我强烈鼓励 JonSkeet 的建议,但一旦您获得了二分搜索的结果,您就可以从结果索引中向后和向前探索,寻找不再支持您的标准的值,这只是一个建议 ;)

【讨论】:

  • 这也是我要做的。我在双语词典中有一个排序的条目集合,并且有重复的词条。
【解决方案3】:

我不完全理解您的问题,但您可以将复杂的自定义 Comparator 传递给 binarySearch 以处理其中一些棘手的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2019-05-21
    • 1970-01-01
    • 2018-02-27
    • 2012-04-22
    • 2021-02-20
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多