Functional programming Java 8列表的自定义分块

Functional programming Java 8列表的自定义分块,functional-programming,java-8,partitioning,Functional Programming,Java 8,Partitioning,我有两张清单 List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> partitionHelper = Arrays.asList(1, 3, 4, 5); 可以安全地假设partitionHelper.sum()>=data.size()。 我需要一个O(n+m)算法(其中n=partitionHelper.size()和m=data.size()) 关于Lis

我有两张清单

List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> partitionHelper = Arrays.asList(1, 3, 4, 5);
可以安全地假设
partitionHelper.sum()
>=
data.size()
。 我需要一个O(n+m)算法(其中n=
partitionHelper.size()
和m=data.size())

关于
List chunk(List,List)
函数实现应该是什么样子的,有什么建议吗

PS:我正在寻找一种功能性风格的方法不是标准的迭代方法

编辑:

在Scala我会这样做

def chunkList(data: List[Int], p: List[Int]): List[List[Int]] = {
  def chunk(data: List[Int], p: List[Int], acc: List[List[Int]]): List[List[Int]] =
    if (p.nonEmpty && data.nonEmpty) {
      chunk(data.drop(p.head), p.tail, acc :+ data.take(p.head))
    } else {
      acc
    }
  chunk(data, p, List())
}

> chunkList((1 to 10).toList, List(1,3,4,5))
> res2: List[List[Int]] = List(List(1), List(2, 3, 4), List(5, 6, 7, 8), List(9, 10))

foldl和foldr的另一个Haskell实现可以找到

将Scala代码翻译成Java后,我得到了以下代码,这只对一个小的
分区帮助程序
列表有用:

List<List<Integer>> chunk(List<Integer> data, List<Integer> p, List<List<Integer>> acc) {
    if (!p.isEmpty() && !data.isEmpty()) {
        int i = Math.min(p.get(0), data.size());
        acc.add(data.subList(0, i));
        return chunk(data.subList(i, data.size()), p.subList(1, p.size()), acc);
    }
    return acc;
}

List<List<Integer>> chunk(List<Integer> data, List<Integer> p) {
    return chunk(new ArrayList<>(data), p, new ArrayList<>());
}
列表块(列表数据、列表p、列表acc){
如果(!p.isEmpty()&&!data.isEmpty()){
inti=Math.min(p.get(0),data.size());
acc.add(数据子列表(0,i));
返回块(data.subList(i,data.size()),p.subList(1,p.size()),acc);
}
返回acc;
}
列表块(列表数据,列表p){
返回chunk(newarraylist(data),p,newarraylist());
}

实际上,
partitionHelper
列表必须很小,因为堆栈用于
chunk
方法的递归调用,并且递归调用的数量与
partitionHelper
列表中的元素一样多。

我需要什么?当你试图自己解决这个问题时发生了什么?您在哪里被阻止的?@ApoorvIngle您的问题是同一问题的变体,您只需为每个分区提供不同的长度。重要的部分是:“不可能分割任意的源流[…],因为这将破坏并行处理。”---你的问题是一个问题。如果要对
列表进行分区
,请不要使用流。使用循环和
子列表()
调用。它的性能也会比任何流式实现好得多。@ApoorvIngle我不知道Scala,但对我来说,它看起来像一个递归函数实现。如果这正是您想要的,那么您为什么要求Java流实现呢?您可以在Java中执行完全相同的递归函数。您所要做的就是编写它。@A或者说在基本Java中没有。流实际上是在集合上实现“功能风格”的唯一内置Java方法,而流没有真正的方法来实现这一点。如果第三方库是游戏,那么您最好使用Guava的
Lists.partition
listreult=newArrayList(partitionHelper.size());int i=0;for(int size:partitionHelper)result.add(data.subList(i,Math.min)(i+=size,data.size())谢谢你的回答,但我正在寻找一种foldLeft/foldRight类型的实现。请参阅我添加到问题中的Haskell链接
List<List<Integer>> chunk(List<Integer> data, List<Integer> p, List<List<Integer>> acc) {
    if (!p.isEmpty() && !data.isEmpty()) {
        int i = Math.min(p.get(0), data.size());
        acc.add(data.subList(0, i));
        return chunk(data.subList(i, data.size()), p.subList(1, p.size()), acc);
    }
    return acc;
}

List<List<Integer>> chunk(List<Integer> data, List<Integer> p) {
    return chunk(new ArrayList<>(data), p, new ArrayList<>());
}