如何在Java中生成列表的所有k-sublists?

时间:2017-11-04 14:45:59

标签: java list java-8

让我们考虑一下:k=2并让List<String> : ["12", "23", "34", "45", "56"]

我们想返回以下列表1...k

优雅的解决方案怎么样?是否有可能用流做?

当然它可以通过多种方式解决,最简单的方法是使用嵌套列表var data = [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65, 3.7, 3.75, 3.8, 3.85, 3.9, 3.95, 4, 4.05, 4.1, 4.15, 4.2, 4.25, 4.3, 4.35, 4.4, 4.45, 4.5, 4.55, 4.6, 4.65, 4.7, 4.75, 4.8, 4.85, 4.9, 4.95, 5, 5.05, 5.1, 5.15, 5.2, 5.25, 5.3, 5.35, 5.4, 5.45, 5.5, 5.55, 5.6, 5.65, 5.7, 5.75, 5.8, 5.85, 5.9, 5.95, 6, 6.05, 6.1, 6.15, 6.2, 6.25, 6.3, 6.35, 6.4, 6.45, 6.5, 6.55, 6.6, 6.65, 6.7, 6.75, 6.8, 6.85, 6.9, 6.95, 7, 7.05, 7.1, 7.15, 7.2, 7.25, 7.3, 7.35] .map((e) => { let str = '' + e; return str.includes('.') ? '' : str }); console.log(data)迭代整个列表。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

使用Streams:

        final List<String> ints = Arrays.asList("1", "2", "3", "4", "5", "6");
        final int k = 2;
        final List<String> result = IntStream.iterate(0, i -> i + 1).limit(ints.size() - k + 1)
                .mapToObj(i -> ints.subList(i, i + k).stream().reduce("", (a, b) -> a + b + ""))
                .collect(Collectors.toList());

        System.out.println(result);3

使用for循环:

    List<String> result = new LinkedList<>();
    for(int i = 0 ; i < ints.size() - k + 1; i++) {
        StringBuilder sb = new StringBuilder();
        for(int j = 0; j < k; j++) {
            sb.append(ints.get(i+j));
        }
        result.add(sb.toString());
    }

    System.out.println(result);

现在自己决定; - )

答案 1 :(得分:3)

如果您的结果中可以使用Collection<String>代替List<String>,那么您可以使用Java 9&#39; Collectors.flatMapping

Collection<String> result = IntStream.range(0, ints.size() - k)
    .boxed()
    .collect(Collectors.groupingBy(i -> i, 
        Collectors.flatMapping(i -> ints.subList(i, i + k).stream(), 
            Collectors.joining())))
    .values();

另一种方式,类似于IEE1394's answer

List<String> result = IntStream.range(0, ints.size() - k)
    .mapToObj(i -> String.join("", ints.subList(i, i + k)))
    .collect(Collectors.toList());