是否有一个内容可以在新的LinkedHashSet中获取LinkedHashSet的最后5个元素?
这就是我现在所拥有的,但效率不高:
new LinkedHashSet<String>(new LinkedList<String>(set)
.subList(Math.max(0, set.size() - 5), set.size());
或者我应该在这种情况下使用TreeSet,SortedSet,HashSet?
答案 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);