如何获取集合的第 n 个元素

2022-09-04 21:42:03

更具体地说:如何获取LinkedHashSet的第n个元素(具有可预测的迭代顺序)?我想检索插入到其中的第n个元素(该元素尚不存在)。Set

使用 :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

这个问题似乎已经演变成讨论任何实施是否能够保留原始广告顺序。因此,我在 http://pastebin.com/KZJ3ETx9 上放置了一些简单的测试代码,以表明是的,LinkedHashSet确实保留了其Javadoc声明的插入顺序(与其迭代顺序相同)。Set

编辑 3

修改了问题的描述,以便每个人都不会太专注于检索最后一个元素(我最初认为问题的标题足以提示 - 显然我错了)。Set


答案 1

此方法基于返回第 n 个元素(而不仅仅是最后一个元素)的更新要求。如果源是例如带有标识符的 Set,则可以通过 选择最后一个元素。mySetnthElement(mySet, mySet.size()-1)

如果 与 的大小相比很小,则此方法可能比转换为 .nSetArrayList

  /**
   * 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;
  }

答案 2

如果你想检索最后一个元素,我会使用LinkedHashSet的迭代器:

Iterator<T> it = linkedHashSet.iterator();
T value = null;

while (it.hasNext()) {
    value = it.next();
}

循环执行值之后将引用最后一个元素。