Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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集合。创建排序视图而不创建副本_Java_Memory_Collections_Comparator - Fatal编程技术网

Java集合。创建排序视图而不创建副本

Java集合。创建排序视图而不创建副本,java,memory,collections,comparator,Java,Memory,Collections,Comparator,是否有可能在不创建副本的情况下对内容进行动态排序的集合进行迭代 更新:要排序的集合是只读列表。使用您可以执行的Streams API yourCollection.stream() .sorted(yourComparator) .forEach(...); 这不会修改yourCollection,并允许您按排序顺序迭代集合。然而,sorted方法可能会在幕后创建一个副本,因此您很可能会得到与创建副本、对副本排序并自己迭代排序副本相同的内

是否有可能在不创建副本的情况下对内容进行动态排序的集合进行迭代


更新:要排序的集合是只读列表。

使用您可以执行的Streams API

yourCollection.stream()
              .sorted(yourComparator)
              .forEach(...);
这不会修改
yourCollection
,并允许您按排序顺序迭代集合。然而,
sorted
方法可能会在幕后创建一个副本,因此您很可能会得到与创建副本、对副本排序并自己迭代排序副本相同的内存/cpu开销


(对于Java 7和更早版本,我认为API中没有“非侵入式”排序方法。如果不想修改原始集合,则必须显式复制。)

假设您正在尝试遍历集合的排序版本

第一个元素是什么?最小元素

但是你必须通读整个集合来确定最小元素,否则就不能保证你没有遗漏一些比之前所有元素都小的元素


这或多或少意味着您必须制作一个副本:您必须先读取整个集合,然后才能开始返回元素,之后再开始读取它有点多余。

如果集合允许索引访问,您可以就地排序(例如快速排序)。这不会创建副本。-Salah说另一个Q是关于“并行排序”的,这不会是很“即时”的,所以它非常不同。“创建副本”有什么不好的?你的收藏到底有多大?复制是一种选择。但我想,还有另一种方法。大小约为10000。有成千上万的人。它是轻量级服务器上的批处理。没有时间限制,但内存有限。10000个集合需要10000个带有ArrayList的引用,因此支持数组是10000的4/8倍。-不是真的同时“数千个”?这不会创建一个副本?不,它完全是在内部创建的。所有流行的JDK实现和所有流行的集合实现都很有可能为您提供实现的流。按复制流排序。但肯定没有什么可以阻止集合以较低的内存开销实现.stream.sorted方法。它会生成一个副本,因为这通常更智能。复制是O(n),排序是O(n*log(n)),迭代是O(n)。据我所知,尝试按顺序迭代未排序的集合将是O(n*n)。在这两种情况下,内存使用率都是O(n)。因此,除非存在内存限制,否则不复制是毫无意义的,但这意味着数组很大,这也使得O(n*n)不可行。人们总是忘记,“复制对象数组”并不意味着“复制数组中的所有对象”。如果原始列表是随机访问的,这并不是不可能的证据。(这是可能的,只是效率不高;应该很容易想象选择排序的流式版本)当然,我们必须多次迭代集合。有时候,它比一本好。例如,如果你的CPU比内存多,但即使多次迭代也不会得到多少好处——简单的方法是O(n^2),这在任何情况下都是不合理的。我不知道有哪种语言的库真正做到了您想要做的事情。