更具体地说:如何获得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)选择最后一个元素。

如果nSet的大小相比较小,则此方法可能比例如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;
  }

09-09 22:09
查看更多