更具体地说:如何获得 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
的集合,最后一个元素可以通过 nthElement(mySet, mySet.size()-1)
选择。
如果 n
与 Set
的大小相比较小,则此方法可能比例如转换为 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;
}
关于java - 如何获取集合的第n个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24464279/