Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取LinkedHashSet最后5个元素的子列表?_Java_Hashset_Sublist_Linkedhashset - Fatal编程技术网

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

Java 获取LinkedHashSet最后5个元素的子列表?,java,hashset,sublist,linkedhashset,Java,Hashset,Sublist,Linkedhashset,在一个新的LinkedHashSet中,是否有一个获取LinkedHashSet的最后5个元素的一行程序 这是我目前拥有的,但效率不高: new LinkedHashSet<String>(new LinkedList<String>(set) .subList(Math.max(0, set.size() - 5), set.size()); 新建LinkedHashSet(新建LinkedList(set) .subList(Math.max(0,set.size(

在一个新的LinkedHashSet中,是否有一个获取LinkedHashSet的最后5个元素的一行程序

这是我目前拥有的,但效率不高:

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

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

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

Set<String> newSet = set.stream()
                        .skip(set.size() - 5)
                        .collect(Collectors.<String>toSet());
Set newSet=Set.stream()
.skip(set.size()-5)
.collect(收集器.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);
long s1=System.nanoTime();
LinkedHashSet last5=新建LinkedHashSet(新建LinkedList(set))
.subList(Math.max(0,set.size()-5),set.size());
System.out.println(System.nanoTime()-s1);
s1=System.nanoTime();
LinkedHashSet usingArrayList=新建LinkedHashSet(新建ArrayList(set))
.subList(Math.max(0,set.size()-5),set.size());
System.out.println(System.nanoTime()-s1);

问题出在这里。
链接数据集的迭代器是单向的;也就是说,即使基础数据结构有一个双链接列表,也不能向后迭代。这意味着要得到最后的N,需要迭代到列表的末尾。也就是说
O(N)

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

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

我最终使用了以下方法:

com.google.common.collect.EvictingQueue<E>
com.google.common.collect.execisingqueue
这样,您可以只保留最后的x元素

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

您的测试有缺陷。第二个测试用例得益于第一个用例预热了缓存。每个测试都需要在自己的运行时调用中运行。@SteveKuo无论我是单独运行还是获得更好的性能:)请解释这与您提出的问题的关系。它如何满足您声明的要求/实际要求?你是怎么用的?