更具体地说:如何获得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,是因为它“定义了迭代顺序,这是将元素插入到集合中的顺序(插入顺序)。请注意,如果将元素重新插入到集合中,则插入顺序不会受到影响。”
编辑2
这个问题似乎变成了关于任何
Set
实现是否可以保留原始插入顺序的讨论。因此,我在http://pastebin.com/KZJ3ETx9处放置了一些简单的测试代码来表明,是的,LinkedHashSet确实确实保留了Javadoc声称的插入顺序(与其迭代顺序相同)。编辑3
修改了问题的描述,以使每个人都不必太着重于检索
Set
的最后一个元素(我本来以为问题的标题就足够暗示了-显然我错了)。 最佳答案
此方法基于更新后的要求,即返回第n个元素,而不仅仅是返回最后一个元素。如果来源是一个带有标识符mySet
的Set,可以通过nthElement(mySet, mySet.size()-1)
选择最后一个元素。
如果n
与Set
的大小相比较小,则此方法可能比例如ozt_code更快。转换为ArrayList
。
/**
* Return an element selected by position in iteration order.
* @param data The source from which an element is to be selected
* @param n The index of the required element. If it is not in the
* range of elements of the iterable, the method returns null.
* @return The selected element.
*/
public static final <T> T nthElement(Iterable<T> data, int n){
int index = 0;
for(T element : data){
if(index == n){
return element;
}
index++;
}
return null;
}