java - 如何在每个第 n 个单词处拆分字符串数组?

标签 java arrays string

我被一个(可能非常简单)的想法难住了。我正在使用 BufferedReader 读取文本文件,并在空格处分割字符串。我需要创建一个新的字符串数组,并将前一个数组中的新元素以 3 秒为单位进行分组,例如{快速的棕色狐狸跳过了懒猫}{快速的棕色狐狸跳过了懒猫}。 p>

到目前为止,我提出了一种非常低效的尝试,即迭代数组并将元素和空格连接到新的字符串数组。它还会在新数组中留下空值,因为我每次都会递增 i+3

String line = "";
while ((line = br.readLine()) != null) {
    String words[] = line.split(" ");
    String[] result = new String[words.length - 1];

    for (int i = 0; i < words.length - 3; i += 3) {
        result[i] = words[i] + " " + words[i + 1] + " " + words[i + 2];
    }
    for (int i = 0; i < result.length; i++) {
        System.out.println(result[i]);
    }
}

输出示例:

a Goose who null null was taking a null null walk by the null null side of the null null "Good heavens!" cried null null the Goose.

最佳答案

你的 friend 是:

  1. Math#ceil
  2. String#join
  3. Arrays#copyOfRange
  4. Integer#min

演示:

import java.util.Arrays;

class Main {
    public static void main(String[] args) {
        final int SIZE = 3;
        String[] arr = { "The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "cat", "Hello" };
        String[] result = new String[(int) Math.ceil((double) arr.length / SIZE)];
        for (int i = 0, j = 0; i < arr.length; i += SIZE, j++) {
            result[j] = String.join(" ", Arrays.copyOfRange(arr, i, Integer.min(arr.length, i + SIZE)));
        }

        System.out.println(Arrays.toString(result));
    }
}

输出:

[The quick brown, fox jumped over, the lazy cat, Hello]

它是如何工作的

Arrays.copyOfRangearr 从索引 i 复制到索引 Integer.min(arr.length, i + SIZE) - 1 其中 Integer.min(arr.length, i + SIZE) 返回 arr.lengthi + SIZE 中的最小值。这对于最后一个副本是必需的,因为 i + SIZE 可能会超出 arr.length 导致 IndexOutOfBoundsException。下面给出了 arrSIZE = 310 元素的示例:

当 i = 0 时, Arrays.copyOfRange(arr, 0, Integer.min(10, 0 + 3)) => Arrays.copyOfRange(arr, 0, 3) 将从索引 0 到索引 2arr 中返回子数组。


当 i = 3 时, Arrays.copyOfRange(arr, 3, Integer.min(10, 3 + 3)) => Arrays.copyOfRange(arr, 3, 6) 将从索引 3 到索引 5arr 中返回子数组。


当 i = 6 时, Arrays.copyOfRange(arr, 6, Integer.min(10, 6 + 3)) => Arrays.copyOfRange(arr, 6, 9) 将从索引 6 到索引 8arr 中返回子数组。


当 i = 9 时, Arrays.copyOfRange(arr, 9, Integer.min(10, 9 + 3)) => Arrays.copyOfRange(arr, 9, 10) 将从索引 9 到索引 9arr 中返回子数组。


关于java - 如何在每个第 n 个单词处拆分字符串数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65260199/

相关文章:

java - 为什么这个流不能并行运行?

java - toString 方法打印空变量,无法理解为什么(Java)

c++ - 声明指向整数数组的指针 C++

java - 3维数组索引越界

java - string.matches(regex) 返回 false,虽然我认为它应该是 true

java - org.apache.http.client-4.3.6 : java. lang.NoClassDefFoundError : org. apache.http.impl.conn.PoolingHttpClientConnectionManager

c++ - 动态数组和类继承

java - 从特定单词后的字符串中获取子字符串

vb.net - 如何禁用 VS2015 中的自动字符串检测?

Python:创建由字符串组成的列表的高效语法