【问题标题】:Java. Collections. Partition by page limit爪哇。收藏品。按页限制分区
【发布时间】:2020-02-11 13:19:04
【问题描述】:

尝试使用 Stream/Collectors 找到正确的方法来做这样的事情:

我有一个桶类型包装器(让它在引擎盖下有 StringBuilder),它有一个字符限制(每个桶 25 个字符)。

我有一个条目的输入流,满足少于 20 个符号的要求。

每个流条目都使用.map(...) 操作进行处理,在条目末尾添加*

我想通过收集器对此类条目的流进行分区(如果这是正确的词)并在不丢失完整性的情况下将它们收集到存储桶中。

输入:

aaaaaaaaaaaaaaaa
aaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaa

输出:

---- bucket 1 ----
    aaaaaaaaaaaaaaaa *
    aaaaaa *
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *
---- bucket 2 ----
    aaaaaaaaaaaaaaaaaa *

我知道如何使用常规循环来实现这一点,如何使用 Stream/Collectors?

【问题讨论】:

  • example = 1,2,3,4 变成 [ [1,2],[3,4] ] 这是你想要的吗??
  • 在非常基本的方法中 - 是的。我想将流的元素收集到一个状态容器中,一旦满足某些条件,它将被一个新的替换。最好把它想象成“我想把多张图片放到一个word文档页面,一旦页面没有空间,就移到另一个页面”
  • @Holger,我想获取元素,进行一些基于字符串的转换,然后将它们存储在具有字符限制的包装器中。意思是,如果我有一个已经满足 199/200 字符限制的存储桶,我想用一个新存储桶替换当前存储桶。 linkedList 和其他内容不相关,仅作为我尝试使用 Collectors 进行的流程的示例。
  • 好的,删除了之前版本的问题。看看这个版本是否正确。
  • 当你“知道如何使用常规循环来实现这一点”时,你应该包括这个。作为一个工作代码示例可以比大多数散文更好地记录任务。此外,当不存在任务的内置收集器时,自定义收集器的代码无论如何都会与循环体的代码共享很多,这使其成为一个很好的起点。

标签: java java-stream collectors


【解决方案1】:

这是一种方法:

您通过输入List 的索引进行流式传输,然后通过将它们除以limit 来对索引进行分组。

List<String> input = Arrays.asList("a","b","c","d");
int limit = 2;
Collection<List<String>> split =
    IntStream.range(0,input.size())
             .boxed()
             .collect(Collectors.groupingBy(i -> i / limit,
                                            Collectors.mapping(input::get,
                                            Collectors.toList())))
             .values();
System.out.println (split);

输出:

[[a, b], [c, d]]

limit 更改为 3 会将输出更改为:

[[a, b, c], [d]]

当然,如果您愿意,您可以轻松地将Collection&lt;List&lt;String&gt;&gt; 转换为List&lt;List&lt;String&gt;&gt;(通过调用List&lt;List&lt;String&gt;&gt; splitList = new ArrayList&lt;&gt;(split);)。

【讨论】:

  • List的大小需要是偶数...万一变成奇数了怎么办??
  • @VishwaRatna 你是什么意思?哪个List的大小?
  • input 我的意思是列表。
  • @VishwaRatna 为什么?如果将输入更改为Arrays.asList("a","b","c","d","e"),则输出变为[[a, b], [c, d], [e]]
  • @AppleBuckler 我建议的代码将产生与您发布的代码相同的输出。如果这不是您需要的输出,也许您应该编辑您的问题。为什么目标 Collection/List 是提前创建的还是由 Stream 管道生成的?
猜你喜欢
  • 1970-01-01
  • 2020-08-03
  • 2012-10-07
  • 2012-08-28
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多