【发布时间】:2014-08-19 07:10:31
【问题描述】:
更具体地说:如何获取 LinkedHashSet 的第 n 个元素(具有可预测的迭代顺序)?我想检索插入到此 Set 中的第 n 个元素(尚未出现)。
使用List 更好吗:
List<T> list = new ArrayList<T>(mySet);
T value = list.get(x); // x < mySet.size()
或toArray(T [] a) 方法:
T [] array = mySet.toArray(new T[mySet.size()]);
T value = array[y]; // y < mySet.size()
除了(可能是轻微的)性能差异之外,还有什么需要注意的吗?有明确的赢家吗?
编辑 1
注意:为什么我想要最后插入的元素并不重要,重要的是我想要它。之所以选择 LinkedHashSet,是因为它“定义了迭代顺序,即元素插入集合的顺序(insertion-order)。请注意,如果将元素重新插入集合中,则插入顺序不受影响。”
编辑 2
这个问题似乎已经转移到讨论任何 Set 实现是否可以永远保留原始插入顺序。所以我在http://pastebin.com/KZJ3ETx9 上放了一些简单的测试代码来证明是的,LinkedHashSet 确实保留了插入顺序(与其迭代顺序相同),正如它的 Javadoc 所声称的那样。
编辑 3
修改了问题的描述,这样大家就不会太专注于检索Set 的最后一个元素(我原本以为问题的标题就足够暗示了——显然我错了)。
【问题讨论】:
-
如果插入顺序很重要,您为什么首先使用
Set?如果元素已经存在于集合中,那么“最后插入的元素”是什么意思? -
@markvgti 没有所谓的“最新鲜”的集合...一个集合没有顺序!
-
@alfasin "这个链表定义了迭代顺序,这是元素插入集合的顺序(插入顺序)。" 迭代顺序是广告订单。
-
@alfasin 这是一个集合。您不能将元素“重新插入”到其中,因为它不包含重复项。一旦一个元素在那里,它就在那里。 “重新插入”一个元素是没有意义的,因为它不会改变
Set,也不应该改变其他任何东西。副作用太难处理了。 -
@alfasin 然而有一个集合实现 with 一个命令——那个实现是
LinkedHashSet。Set不保证订购,也不禁止订购。因此,Set的实现有订单是完全可以的。
标签: java collections set