是否有一个班轮在新的LinkedHashSet中获取LinkedHashSet的最后5个元素?获取LinkedHashSet的最后5个元素的子列表?
这是我现在有,但它是不是很有效:
new LinkedHashSet<String>(new LinkedList<String>(set)
.subList(Math.max(0, set.size() - 5), set.size());
或者我应该使用这种情况下一个TreeSet,SortedSet的,HashSet的?
是否有一个班轮在新的LinkedHashSet中获取LinkedHashSet的最后5个元素?获取LinkedHashSet的最后5个元素的子列表?
这是我现在有,但它是不是很有效:
new LinkedHashSet<String>(new LinkedList<String>(set)
.subList(Math.max(0, set.size() - 5), set.size());
或者我应该使用这种情况下一个TreeSet,SortedSet的,HashSet的?
我结束了使用此:
com.google.common.collect.EvictingQueue<E>
这个你只保留最后x元素。
EvictingQueue<String> queue = EvictingQueue.create(5);
如果使用Java 8,你确定要回一个HashSet
(而不是LinkedHashSet
),你可以使用Stream API:
Set<String> newSet = set.stream()
.skip(set.size() - 5)
.collect(Collectors.<String>toSet());
使用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);
您的测试存在缺陷。第二个测试案例受益于第一种情况已经预热了缓存。每个测试都需要在自己的运行时调用中运行。 –
@SteveKuo无论我是否单独跑步并获得更好的表现:) – muzahidbechara
这是问题所在。 LinkedHashSet
的迭代器是单向的;即不能向后迭代,即使底层数据结构具有双向链接列表。这意味着你需要迭代到列表的最后。那是O(N)
。
在你的算法中,LinkedList
构造函数使用(可能)迭代器将该集合复制到新的数据结构中。
相反,TreeSet
API有一个descendingIterator()
方法,该方法返回一个Iterator
,它向后遍历列表。如果你正确地使用它,你可以得到O(1)
中最后5个元素的集合。缺点是对于基于散列的集合,将元素添加到集合将是O(logN)
而不是O(1)
。
请解释这是如何涉及到你问的问题。它是如何满足你陈述的要求/实际要求的?你怎么使用它? –