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

标签 java collections set

更具体地说:如何获得 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) 选择。

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

相关文章:

java - 一个 Java Play 操作中的多个 WS 调用

python - 获取独特的多集列表

java - 我可以在此示例中使用集合或列表吗?

java - 在 ArrayList 中查找具有相同 String 成员的自定义对象

java - 在 Java 中添加多个 Set<String>

pointers - Go 中独特的函数集合

java - 如何在 Spring 中池化对象?

java - 为什么我没有得到保存的首选项?

java - Tomcat : Installing LetsEncrypt certificate for https, 不工作

python - 在 Python 中设置子类时定义 __repr__