2016-04-10 43 views
0

是否有一个班轮在新的LinkedHashSet中获取LinkedHashSet的最后5个元素?获取LinkedHashSet的最后5个元素的子列表?

这是我现在有,但它是不是很有效:

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

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

回答

0

我结束了使用此:

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

这个你只保留最后x元素

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

请解释这是如何涉及到你问的问题。它是如何满足你陈述的要求/实际要求的?你怎么使用它? –

0

如果使用Java 8,你确定要回一个HashSet(而不是LinkedHashSet),你可以使用Stream API:

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

使用ArrayList你可以得到一个更好的性能:

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); 
+0

您的测试存在缺陷。第二个测试案例受益于第一种情况已经预热了缓存。每个测试都需要在自己的运行时调用中运行。 –

+0

@SteveKuo无论我是否单独跑步并获得更好的表现:) – muzahidbechara

0

这是问题所在。 LinkedHashSet的迭代器是单向的;即不能向后迭代,即使底层数据结构具有双向链接列表。这意味着你需要迭代到列表的最后。那是O(N)

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

相反,TreeSet API有一个descendingIterator()方法,该方法返回一个Iterator,它向后遍历列表。如果你正确地使用它,你可以得到O(1)中最后5个元素的集合。缺点是对于基于散列的集合,将元素添加到集合将是O(logN)而不是O(1)

相关问题