【问题标题】:How to search in a Set (using a Comparator)如何在集合中搜索(使用比较器)
【发布时间】:2010-07-29 14:37:19
【问题描述】:

我想在集合中搜索而不手动迭代元素,但似乎没有一种方法可以执行 Collections.search(myset, target, new ComparatorThing())。我没有看到什么吗?

谢谢。

编辑:

  • 我正在搜索除元素自然顺序之外的其他字段。
  • 作为手动解决方法,我使用了以下静态方法。应该没问题,因为无论如何您都无法使用比较器中的自定义字段对对方做出任何假设。
public static  T search(final Set set, final T searchEntry, final Comparator comparator) {
    for (final T entry : set) {
        if (comparator.compare(entry, searchEntry) == 0) {
            return entry;
        }
    }

    return null;
}

【问题讨论】:

    标签: java collections sorting set comparator


    【解决方案1】:

    查看http://commons.apache.org/collections/,例如:public static java.util.Set SetUtils.predicatedSet(set, predicate)

    【讨论】:

    • 谢谢,这会有所帮助。应该更频繁地使用公共集合,但不知何故我没有。其中许多东西应该集成到 std API imho 中。
    【解决方案2】:

    此处需要更多详细信息 - 您是否尝试通过 Set 中包含的对象中的单个字段进行搜索?或者只是在Set中找到某个元素?

    Set 本身的想法,作为裸接口,不知道排序 - 您需要遍历每个元素。

    但是,如果您将自己限制在SortedSet,其中有一个排序,您可能会利用排序,但由于Sets 不允许随机访问,您仍然必须要么遍历每个元素或了解有关集合的更多信息,而不仅仅是 Set

    您能否详细说明您的算法以及您要完成的工作?

    Set 可能不是表示您要“搜索”的数据的理想方式。

    【讨论】:

    • 对不起,我正在搜索一个单独的字段(这就是为什么我需要能够指定一个比较器)实际上我使用的是一个 TreeSet,其中包含字符串名称和字符串值的元素被排序按他们的名字(出于显示原因 - 我们在前端)但现在我必须按值搜索它们。我现在通过手动迭代所有条目并应用(值)比较器来实现它。名称和值是唯一的。
    • 您要用于“搜索”的比较器是否与构造 TreeSet 的比较器相同(或者如果您没有将 Comparator 传递给 TreeSet 构造函数,则为它与您的课程中使用的相同比较逻辑实现Comparable?)如果是,您也许可以利用floor()ceiling() 方法之一 - 这些利用树结构来搜索节点。
    • 比较器不同,这是实际问题。
    【解决方案3】:

    Collection 界面尝试contains(Object o)。 Set 接口扩展了 Collection,因此所有集合都需要实现 Collection 方法。

    请记住,如果您只知道要搜索的对象是一个集合,那么您无法保证有任何方法可以在不迭代每个元素的情况下进行搜索,因为 contains() 方法可能或根据您实际使用的集合实现类型,可能不会这样做。

    参考文献

    【讨论】:

    • 谢谢,但是 contains 的问题是,我想搜索与它的 equals / compareTo 行为关联的属性不同的属性。
    【解决方案4】:

    TreeSet 有一些可能有用的方法,例如ceiling 用于搜索大于或等于搜索键的下一个元素,floor 用于获取下一个较低元素。还有 headSet、tailSet 和 subSet 来搜索集合中更低、更大或在给定限制之间的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      相关资源
      最近更新 更多