获取LinkedHashSet的最后5个元素的子列表?

时间:2016-04-10 05:48:35

标签: java hashset sublist linkedhashset

是否有一个内容可以在新的LinkedHashSet中获取LinkedHashSet的最后5个元素?

这就是我现在所拥有的,但效率不高:

new LinkedHashSet<String>(new LinkedList<String>(set)
.subList(Math.max(0, set.size() - 5), set.size());

或者我应该在这种情况下使用TreeSet,SortedSet,HashSet?

4 个答案:

答案 0 :(得分:0)

如果您使用Java 8并且可以返回HashSet(而不是LinkedHashSet),则可以使用Stream API:

Set<String> newSet = set.stream()
                        .skip(set.size() - 5)
                        .collect(Collectors.<String>toSet());

答案 1 :(得分:0)

使用long s1 = System.nanoTime(); LinkedHashSet<String> last5 = new LinkedHashSet<String>(new LinkedList<String>(set) .subList(Math.max(0, set.size() - 5), set.size())); System.out.println(System.nanoTime() - s1); s1 = System.nanoTime(); LinkedHashSet<String> usingArrayList = new LinkedHashSet<String>(new ArrayList<String>(set) .subList(Math.max(0, set.size() - 5), set.size())); System.out.println(System.nanoTime() - s1); 可以获得更好的效果:

{{1}}

答案 2 :(得分:0)

这是问题所在。 Option[A] => (A => Option[B]) => Option[B]的迭代器是单向的;即使基础数据结构具有双向链表,您也不能向后迭代。这意味着要获得最后的N,您需要迭代到列表的末尾。那是LinkedHashSet

在您的算法中,O(N)构造函数正在使用(可能)迭代器将集合复制到新的数据结构中。

相比之下,LinkedList API有一个TreeSet方法,它返回一个descendingIterator(),它在列表中向后迭代。如果您正确使用它,则可以在Iterator中获取该集合的最后5个元素。缺点是,对于基于散列的集合,向集合添加元素将为O(1)而不是O(logN)

答案 3 :(得分:0)

我最终使用了这个:

com.google.common.collect.EvictingQueue<E>

这样你就可以只保留最后x个元素

EvictingQueue<String> queue = EvictingQueue.create(5);