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

问题

我确定有一个很好的理由,但有人可以解释为什么java.util.Set接口缺少get(int Index),或任何类似的get()方法?

似乎套装非常适合放入,但我找不到从中检索单个项目的优雅方式。

如果我知道我想要第一个项目,我可以使用set.iterator().next(),但是否则我似乎必须转换为数组来检索特定索引处的项目?

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

我确信它被排除在API之外意味着有一个很好的理由不这样做 - 有人可以开导我吗?

**编辑:**这里有一些非常好的答案,还有一些说"更多背景"。特定场景是一个dbUnit测试,我可以合理地断言查询返回的集只有一个项目,我试图访问该项目。

但是,没有这种情况,问题更有效,因为它仍然更受关注:

集合和列表之间有什么区别。

感谢所有人在下面的精彩答案。


#1 热门回答(166 赞)

因为套装没有订购。有些实现(特别是那些实现java.util.SortedSet接口的实现),但这不是集合的一般属性。

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


#2 热门回答(71 赞)

实际上,在编写使用对象关系映射的JavaEE应用程序时(例如使用Hibernate),这是一个反复出现的问题;来自所有在这里回复的人,Andreas Petersson是唯一了解真正问题并提供正确答案的人:Java缺少一个UniqueList! (或者你也可以将其称为OrderedSet或IndexedSet)。

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

此"IndexedSet"与SortedSet不同 - 在SortedSet中,元素使用比较器(或使用其"自然"排序)进行排序。

但是它更接近LinkedHashSet(其他人也建议),或者更接近于(也不存在)"ArrayListSet",因为它保证元素以与插入时相同的顺序返回。

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

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


#3 热门回答(28 赞)

只需添加mmyers' answer中未提及的一个点。

如果我知道我想要第一个项目,我可以使用set.iterator()。next(),但是否则似乎我必须转换为数组来检索特定索引处的项目?从集合中检索数据的适当方法是什么? (除了使用迭代器)

你还应该熟悉SortedSet接口(其最常见的实现是TreeSet)。

SortedSet是一个Set(即元素是唯一的),它通过元素的自然排序或使用someComparator保持排序。你可以使用first()last()方法轻松访问第一个和最后一个项目。 ASortedSet每隔一段时间都会派上用场,当你需要保持你的收藏品无重复和以某种方式订购时。

编辑:如果需要一个其元素以插入顺序保存的Set(非常类似于List),请查看LinkedHashSet