2010-07-29 96 views
1

我想在集合中进行搜索而无需在elments上手动迭代,但似乎没有办法执行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; 
}

回答

1

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

+0

谢谢,这将有所帮助。人们应该更频繁地使用公共收藏,但不知何故我不会。这些东西中的很多应该集成到std API imho中。 – 2010-07-30 12:40:23

0

尝试contains(Object o),从Collection接口。 Set接口扩展了Collection,所以所有集合都需要实现Collection方法。请记住,如果你知道你要搜索的对象是它保证是一个集合,那么你不能保证没有任何方法可以在没有迭代每个元素的情况下进行搜索,因为这个方法可能或可能会不取决于你实际使用什么类型的实现。

参考

+0

谢谢,但包含的问题是,我想寻找不同的属性比它的相关的一等于/的compareTo行为。 – 2010-07-30 12:24:48

1

在这里需要一些更多的细节 - 你试图通过一个单独的领域中所含Set对象进行搜索吗?或者只是在Set中找到某个元素?

Set本身作为光秃秃的接口,不知道排序 - 你需要遍历每一个元素。

不过,如果你限制自己SortedSet,其中有一个地方的排序,你可能利用排序的,但由于Set■不要允许随机访问,你仍然必须要么每次迭代元素或知道更多有关集合的信息,而不仅仅是它是一个Set

您可以详细说明您的算法以及您正在尝试完成的任务吗?

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

+0

对不起,我正在寻找一个单独的字段(这就是为什么我neet能够指定一个比较器) 实际上,我使用了一个TreeSet,其中包含字符串名称和字符串值的元素按其名称排序显示原因 - 我们在前端),但现在我必须按价值搜索它们。 我现在通过手动迭代所有条目并应用(值)比较器来实现它。 名称和值是唯一的。 – 2010-07-30 12:29:35

+0

是你想用于“搜索”的比较器,是否与'TreeSet'构造的相同(或者,如果你没有向'TreeSet'构造器传递一个'Comparator',它是否使用了相同的比较逻辑你的类是类Comparable吗?)如果是的话,你可以利用'floor()'或'ceiling()'方法之一 - 它们利用树结构搜索节点。 – 2010-07-30 13:28:59

+0

比较器是不同的,这是实际的问题。 – 2010-08-02 08:32:06

0

TreeSet有一些可能有用的方法,例如ceiling来搜索大于或等于搜索关键字floor的下一个元素以获取下一个较低的元素。 headSet,tailSet和subSet也可以搜索更低,更大或给定范围之间的部分。