【问题标题】:Getting last of LinkedHashSet获取最后一个 LinkedHashSet
【发布时间】:2012-12-11 00:48:40
【问题描述】:

我想存储一个数字列表 1,2,3,4 - (让我们以 List<Integer> 开头)

我想确保数字是唯一的(好的,好的,Set<Integer>

我想保证订单(好的...LinkedHashSet<Integer>

我想从列表中获取最后一个元素..

请问将最后一个数字插入LinkedHashSet<Integer> 的最简单方法是什么?

【问题讨论】:

  • 很难相信 java 的 LinkedHashSet 为您提供了第一个迭代器,但不是最后一个......但它似乎 另见stackoverflow.com/questions/1936462 列出了一些第 3 方库

标签: java


【解决方案1】:

对此没有预烘焙选项。有两种现成的选择,但都不是很好:

Order n 方法:

public <E> E getLast(Collection<E> c) {
    E last = null;
    for(E e : c) last = e;
    return last;
}

呸!但也有一个 Order 1 方法:

class CachedLinkedHashSet<E> extends LinkedHashSet<E> {
    private E last = null;

    @Override
    public boolean add(E e) {
        last = e;
        return super.add(e);
    }
    public E getLast() {
        return last;
    }

}

这是现成的,因此其中可能存在一个微妙的错误,并且可以肯定这不是线程安全的或任何东西。您的需求可能会有所不同,并导致您采用一种方法而不是另一种方法。

【讨论】:

  • 缓存的方法使得删除 O(n)。
  • @SLaks 不是真的。这两种方法在技术上具有不同的合同。 getLast 方法只是告诉您添加的最后一个元素。它不保证元素仍在列表中。
  • 但这可能不是 OP 想要的。
  • 这正是我们所要求的。 “插入最后一个数字的最简单方法是什么”。无论如何,我正在寻找一个更成熟的解决方案,因为即使您记录了这一事实,它仍然可能会让用户感到惊讶。
  • @rogerdpack 如果我不得不猜测,那是因为我没有&lt;E&gt;extends LinkedHashSet - 就像我说的可能有一个微妙的错误 - 我只是把它写在我的脑海里。 ..显然在平安夜哈哈...解释了为什么我没有编译它! :)
【解决方案2】:

使用,您可以获得LinkedHashSet 的连续Stream,跳过前n-1 个元素并获得最后一个。

Integer lastInteger = set.stream().skip(s.size()-1).findFirst().get();

【讨论】:

【解决方案3】:

首先,我同意 corsiKa 的解决方案,它建议扩展版本的 LinkedHashSet 类,其中包含指向最后一个元素的指针。但是,您可以通过为数组消耗一些空间来使用传统方式:

set.toArray()[ set.size()-1 ] // returns the last element.

【讨论】:

  • 恐怕这需要一直到AbstractCollection.toArray(),因为得到最后一个元素,它会硬拷贝整个集合。非常低效。
  • 与简单地迭代所有条目以获得最后一个条目相比,这似乎没有任何好处(正如@corsiKa 下面建议的那样)。
【解决方案4】:

这是一个添加方法来访问最后一个条目 O(1) 的实现:

LinkedHashSetEx.java

享受...

【讨论】:

  • 请不要依赖第三方链接获取答案。此链接可能随时停止工作,在这种情况下,您的回答将毫无用处。
  • 请注意,此示例使用反射来访问 java.util.LinkedHashMap 的私有成员,这可能会导致安全异常。
【解决方案5】:

集合与顺序无关。我们不能按索引访问元素。如果您需要最后一个元素,

1)创建新的ArrayList(Set)

arrayList 的最后一个元素可以轻松访问

【讨论】:

  • 该问题特别提到了 LinkedHashSet 它确实具有先天顺序(在 javadoc 中定义为将唯一项添加到集合中的顺序)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 2023-03-16
相关资源
最近更新 更多