Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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中的Akka流按id排序_Java_Sorting_Functional Programming_Akka_Akka Stream - Fatal编程技术网

java中的Akka流按id排序

java中的Akka流按id排序,java,sorting,functional-programming,akka,akka-stream,Java,Sorting,Functional Programming,Akka,Akka Stream,我需要在java中按id对akka流列表进行排序 我有akka来源中的对象列表: SystemCodeTracking{id=9, EntityName='table3'} SystemCodeTracking{id=2, EntityName='table2'} SystemCodeTracking{id=10, EntityName='table1'} 我需要将其排序为: SystemCodeTracking{id=2, EntityName='table2'} SystemCodeTra

我需要在java中按id对akka流列表进行排序 我有akka来源中的对象列表:

SystemCodeTracking{id=9, EntityName='table3'}
SystemCodeTracking{id=2, EntityName='table2'}
SystemCodeTracking{id=10, EntityName='table1'}
我需要将其排序为:

SystemCodeTracking{id=2, EntityName='table2'}
SystemCodeTracking{id=9, EntityName='table3'}
SystemCodeTracking{id=10, EntityName='table1'}
代码应如下所示:

Source<SystemCodeTracking, SourceQueueWithComplete<SystemCodeTracking>> loggedSource = source.map(single -> sortingFunction(single));
sourceloggedsource=Source.map(single->sortingFunction(single));

我的问题是如何执行
排序功能

排序基本上破坏了流的性质,因为您需要使用整个流(即将其装入内存)来应用排序功能。无论如何,可以将整个源代码耗尽到
Sink.seq
,然后对结果进行排序

source.runWith(Sink.seq, materializer)
然后在完成阶段调用结果

sortingFunction(result)
如果您想对源代码的各个部分进行排序,而不是对全部内容进行排序,可以执行以下操作

source.grouped(10).map(batch -> sortingFunction(batch))

排序基本上会破坏流的性质,因为您需要使用整个流(即将其装入内存)来应用排序功能。无论如何,可以将整个源代码耗尽到
Sink.seq
,然后对结果进行排序

source.runWith(Sink.seq, materializer)
然后在完成阶段调用结果

sortingFunction(result)
如果您想对源代码的各个部分进行排序,而不是对全部内容进行排序,可以执行以下操作

source.grouped(10).map(batch -> sortingFunction(batch))

如果找不到序列的最小元素(该元素将首先在结果排序流中发出),则无法对序列(无论是Akka流还是其他任何内容)进行排序。如果流是无限的,通常就是这种情况

在某些情况下,您甚至可以对无限流进行排序,即使在内存限制较低的情况下-e。G若您可以通过只查看最后N个元素来确定下一个最小元素。或者,您可以利用特定于案例的知识,当满足某个条件时,您可以确保某类元素永远不会出现在您的流中

否则,您唯一的选择就是将排序问题升级一级:您真的需要流中的强顺序吗?也许仅仅划分流就足够了-i。E将其拆分为具有相同键的元素子流


我猜Akka流没有
流的原因是,Akka流完全是关于资源消耗的有界性,而排序流需要O(n)个内存。

如果找不到序列的最小元素,则无法对序列(无论是Akka流还是其他任何序列)进行排序(将在结果排序流中首先发出)。如果流是无限的,通常会出现这种情况

在某些情况下,您甚至可以对无限流进行排序,即使在较低的内存限制内,例如,如果您可以通过只查看最后N个元素来确定下一个最小元素,或者您可以利用特定于案例的知识,即当满足某个条件时,您可以确保某些元素类永远不会出现在您的流中

否则,您唯一的选择就是将排序问题升级一级:您真的需要流中的强顺序吗?也许只需将流进行分区就足够了-即将其拆分为具有相同键的元素的子流


我猜Akka流没有
流的原因是,Akka流完全是关于资源消耗的有界性,而排序流需要O(n)个内存。

根据定义,流是无界的=>提供完美的排序需要在发出第一个数据之前观察所有数据

然而,在很多情况下,虽然可以假设流只是部分未排序,也就是说,由于并行处理,数据会稍微混合,但每个元素最终与其实际位置的距离不会超过1000个位置

在这种情况下,可以使用带有缓冲区的排序方法,如下所示:

   * partial sort of a stream: wait for <bufferSize> to be buffered, the start flushing them out in order
   * */
  def sort[T, S](bufferSize: Int, order: T => S)(implicit ordering: Ordering[S]): () => T => Iterable[T] = () => {

    var buffer = List.empty[T]

    t: T => {
      buffer = (buffer :+ t).sortBy(order)
      if (buffer.size < bufferSize) Iterable.empty[T]
      else {
        val r = buffer.head
        buffer = buffer.tail
        List(r)
      }
    }
  }

根据定义,流是无界的=>提供完美的顺序需要在发出第一个数据之前观察所有数据

然而,在很多情况下,虽然可以假设流只是部分未排序,也就是说,由于并行处理,数据会稍微混合,但每个元素最终与其实际位置的距离不会超过1000个位置

在这种情况下,可以使用带有缓冲区的排序方法,如下所示:

   * partial sort of a stream: wait for <bufferSize> to be buffered, the start flushing them out in order
   * */
  def sort[T, S](bufferSize: Int, order: T => S)(implicit ordering: Ordering[S]): () => T => Iterable[T] = () => {

    var buffer = List.empty[T]

    t: T => {
      buffer = (buffer :+ t).sortBy(order)
      if (buffer.size < bufferSize) Iterable.empty[T]
      else {
        val r = buffer.head
        buffer = buffer.tail
        List(r)
      }
    }
  }

我试着做这个Sink.seq().contramap(this::sortList).foreach(x->System.out.println(x));但是它表明我的sortList函数从未调用过。我让我的source.toMat(Sink.keep.left())运行(materializer)您需要对sink.seq运行源代码,然后对结果进行排序。您不能在流阶段对结果进行排序。您需要运行流并在之后对数据进行排序,但sink.seq()似乎永远不会运行,因为流永远不会结束。滑动窗口可能是将数据分组在一起的解决方案吗?在一般情况下,不可能对无限流进行排序。为了确定结果流中的第一个元素,您必须将其与所有其他元素进行比较。我尝试了这样做:Sink.seq().contramap(this::sortList).foreach(x->System.out.println(x));但是它表示从未调用过我的sortList函数。我有我的source.toMat(sink.keep.left()).run(Materialer)您需要对sink.seq运行源代码,然后对结果进行排序。您不能在流阶段对结果进行排序。您需要在sink.seq()之后运行流并对数据进行排序似乎永远不会运行,因为流从未结束。滑动窗口可能是将数据分组在一起的解决方案吗?在一般情况下,不可能对无限流进行排序。为了确定结果流中哪个元素是第一个,您必须将其与所有其他元素进行比较。排序函数必须有两个参数-两个要排序的元素be comparedSorting函数必须有两个参数-两个要比较的元素