为什么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
。