当前位置: 首页 > 知识库问答 >
问题:

java stream 8,每六个字打印一行

梁丘翔
2023-03-14
public class Histogram {
    public static void main(String[] args) throws IOException {
        Stream<String> stream = Files.lines(Paths.get("words.txt"));
        ArrayList<String> list = (ArrayList<String>) stream
                .map(w -> w.split("\\.|\\s+|,")).flatMap(Arrays::stream)
                .filter(x-> x.length() != 0)
                .collect(Collectors.toList());
        list.forEach(s -> System.out.print(s + "(" + s.length() + ") "));
    }  
}

现在我把所有结果都放在一行了。如何在这个Java流中创建逻辑8,将forEach循环中的每5个字放入换行符(System.out.println)。每六个字印一行。

共有2个答案

戚勇
2023-03-14

您可以使用

private static final String NEW_LINE = System.lineSeparator();

public static String addNewLines(String str, int n) {
    
    String[] words = str.split(" ");
    
    int size = words.length;
    
    int lines = (int) Math.round((double) size / n);
    
    int lastLine = size - lines * n;
    
    return IntStream.range(0, lines)
            .mapToObj(i -> toString(words, i * n, i * n + n))
            .collect(Collectors.joining(NEW_LINE, "", lastLine > 0 
                            ? NEW_LINE + toString(words, size - lastLine, size)
                            : ""));
}

private static String toString(String[] words, int start, int end) {
    return Arrays.stream(words, start, end).collect(Collectors.joining(" "));
}

然后:

String str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam egestas maximus augue, in vehicula erat dictum quis. Sed rhoncus tempor maximus. Etiam tempus tristique ex et imperdiet.";

System.out.println(addNewLines(str, 5));

输出:

Lorem ipsum dolor sit amet,
consectetur adipiscing elit. Nam egestas
maximus augue, in vehicula erat
dictum quis. Sed rhoncus tempor
maximus. Etiam tempus tristique ex
et imperdiet.
李建中
2023-03-14

将列表拆分为5个块,并将每个块中的项连接起来。

IntStream.iterate(0, i -> i < list.size(), i -> i + 5)
    .forEach(i -> System.out.println(
        IntStream.range(i, Math.min(i + 5, list.size()))
            .mapToObj(list::get)
            .map(s -> s + "(" + s.length() + ")")
            .collect(Collectors.joining("; "))
    ));

注意:流。Java 9中提供了带条件的迭代。纯Java8解决方案可以使用流。使用计算的块数限制

IntStream.iterate(0, i -> i + 5)
    .limit(list.size() / 5 + (list.size() % 5 > 0 ? 1 : 0))
    .forEach(i -> System.out.println(
        IntStream.range(i, Math.min(i + 5, list.size()))
            .mapToObj(list::get)
            .map(s -> s + "(" + s.length() + ")")
            .collect(Collectors.joining("; "))
    ));

 类似资料:
  • #include <stdio.h> #include <pthread.h> typedef struct { int a; int b; int c; int d; pthread_mutex_t mutex; }ex_st; int main(void) { ex_st st = {1, 2,

  • 问题内容: 我有这个字符串:我想使用Python作为打印它。 仅适用于整数。 怎么做到呢? 问题答案: 您可以将字符串转换为int生成器,对每个元素应用十六进制格式,并使用分隔符插入:

  • 我有这个字符串:并且我想使用Python将其打印为48:65:6c:6c:6f:2c:20:57: 6f: 72:6c: 64:21。 仅适用于整数。 怎样才能做到呢?

  • 问题内容: 最近我一直在使用带有大量数字的循环来打印Hello World: 我知道这是一种非常愚蠢的方法,但是我从未使用过Java中的任何计时器库。一个如何修改以上内容以每3秒打印一次? 问题答案: 你还可以查看和类,这些类可用于计划任务每​​秒钟运行一次。 你需要一个扩展并覆盖该方法的类,该类将在每次将该类的实例传递给方法时执行。 这是一个示例,每5秒打印一次:-

  • 最近,我一直使用带有大数字的循环来打印: 我知道这是一个非常愚蠢的方法,但我从来没有使用任何计时器库在Java。如何修改上面的打印每说3秒?

  • 场景A(硬代码)手工输入字符串项: 系统输出: 场景B(软代码)从数据库查询字符串项: 系统输出: 这打印到单行,这不是我想要的,我如何使这打印像场景a(每个项目的新行)