为什么java.util.Set没有get(int index)?

2022-08-31 05:39:23

我相信有一个很好的理由,但是有人可以解释为什么界面缺少,或任何类似的方法吗?java.util.Setget(int Index)get()

似乎集合非常适合放入其中,但我找不到一种优雅的方法来从中检索单个项目。

如果我知道我想要第一个项目,我可以使用,但除此之外,似乎我必须强制转换为数组才能检索特定索引处的项目?set.iterator().next()

从集合中检索数据的适当方法是什么?(除了使用迭代器)

我敢肯定,它被排除在API之外的事实意味着有充分的理由不这样做 - 有人可以启发我吗?

编辑:这里有一些非常好的答案,还有一些说“更多的背景”。具体场景是 dbUnit 测试,我可以合理地断言从查询返回的集合只有 1 个项目,并且我正在尝试访问该项目。

但是,如果没有这种情况,这个问题就更有效了,因为它仍然更加集中:

集合和列表有什么区别

感谢大家在下面提供精彩的答案。


答案 1

因为集合没有顺序。一些实现可以(特别是那些实现接口的实现),但这不是集合的一般属性。java.util.SortedSet

如果您尝试以这种方式使用集合,则应考虑改用列表。


答案 2

实际上,在编写使用对象关系映射(例如Hibernate)的JavaEE应用程序时,这是一个反复出现的问题。从所有在这里回复的人中,安德烈亚斯·彼得森是唯一一个理解真正问题并给出正确答案的人:Java缺少UniqueList!(或者您也可以将其称为 OrderedSet 或 IndexedSet)。

Maxwing提到了这个用例(在这个用例中,你需要有序的和唯一的数据),他建议使用SortedSet,但这不是Marty Pitt真正需要的。

此“索引集”与排序集不同 - 在排序集中,元素是使用比较器(或使用其“自然”排序)进行排序的。

但相反,它更接近LinkedHashSet(其他人也建议),甚至更接近(也不存在的)“ArrayListSet”,因为它保证元素以与插入时相同的顺序返回。

但是LinkedHashSet是一个实现,而不是一个接口!我们需要的是一个索引集(或列表集,或有序集,或UniqueList)接口!这将允许程序员指定他需要一个具有特定顺序且没有重复的元素的集合,然后使用任何实现(例如Hibernate提供的实现)对其进行实例化。

由于JDK是开源的,也许这个接口最终会被包含在Java 7中......


推荐