1. 概述

在Java中,字符串(String)可能是最常用的类型之一。本教程将探讨如何将字符串转换为字符串数组(String[])。

2. 问题介绍

将字符串转换为字符串数组可能有以下两种情况:

  1. 将字符串转换为单元素数组(只有一个元素的数组)
  2. 根据特定规则将字符串分割成数组元素

对于第一种情况,理解起来相对简单。例如,如果我们有一个字符串 "baeldung",我们希望将其转换为 String[]{"baeldung"}。换句话说,转换后的数组只有一个元素,即输入字符串本身

对于第二种情况,我们需要根据要求将输入字符串拆分成片段。结果完全取决于具体需求。例如,如果期望最终数组中的每个元素包含输入字符串中的相邻两个字符,对于 "baeldung",我们将得到 String[]{"ba", "el", "du", "ng"}。稍后我们会看到更多的例子。

在这个教程中,我们将使用以下字符串作为输入:

String INPUT = "Hi there, nice to meet you!";

我们将涵盖这两种转换场景,并且为了简化,我们将使用单元测试断言来验证我们的解决方案是否按预期工作。

3. 转换为单元素数组

由于目标数组中的唯一元素将是输入字符串,我们可以直接使用输入字符串初始化一个数组来解决问题

String[] myArray = new String[] { INPUT };
assertArrayEquals(new String[] { "Hi there, nice to meet you!" }, myArray);

运行测试后,它会通过。

4. 将输入字符串转换为数组元素

现在,让我们看看如何将输入字符串分割成段。

4.1. 使用 Stringsplit() 方法

在处理特定模式的输入字符串时,我们经常需要这样做。 在这种情况下,我们可以使用正则表达式或正则表达式将输入字符串分割成 String 数组。Java的 String 类提供了 split() 方法来完成这项工作

接下来,我们将按照不同的要求分割我们的示例输入。

首先,假设我们要将输入句子分割成一个包含子句的数组。为此,我们可以根据标点符号分割输入字符串:

String[] myArray = INPUT.split("[-,.!;?]\\s*" );
assertArrayEquals(new String[] { "Hi there", "nice to meet you" }, myArray);

值得注意的是,当我们需要正则表达式的字符类包含破折号字符时,可以将其放在开头。

上述测试显示,输入字符串被分割成两个子句的数组。

接下来,我们将从相同的输入字符串中提取所有单词,形成一个单词数组。这在现实世界中也可能遇到。

为了获取单词数组,我们可以使用非单词字符 (\W+) 分割输入:

String[] myArray = INPUT.split("\\W+");
assertArrayEquals(new String[] { "Hi", "there", "nice", "to", "meet", "you" }, myArray);

最后,我们将输入字符串分解成字符:

String[] myArray = INPUT.split("");
assertArrayEquals(new String[] {
    "H", "i", " ", "t", "h", "e", "r", "e", ",", " ",
    "n", "i", "c", "e", " ", "t", "o", " ", "m", "e", "e", "t", " ", "y", "o", "u", "!"
}, myArray);

如上代码所示,我们使用空字符串(零宽度)作为正则表达式。输入字符串中的每个字符,包括其中的空格,都将作为目标数组的元素。

值得注意的是,String.toCharArray() 也会将输入转换为数组,但目标数组是 char[]char[]),而不是 String[]String[])。

这三个例子使用了 String.split() 方法将输入字符串转换为不同类型的字符串数组。一些流行库,如 GuavaApache Commons,也提供了增强的字符串分割功能。我们在 另一篇文章 中详细讨论过这一点。

此外,我们还有许多其他文章讨论如何解决不同的具体分隔问题【搜索关键字:split string】。

4.2. 特殊解析要求

有时,我们必须遵循特定的规则来分割输入。一个例子可以快速说明这一点。假设我们有以下输入字符串:

String FLIGHT_INPUT = "20221018LH720FRAPEK";

期望的结果数组如下:

{ "20221018", "LH720", "FRA", "PEK" }

乍看之下,这个转换逻辑可能有些复杂。但如果列出输入字符串的定义,就能明白为什么期望这样的数组:

[date][Flight number][Airport from][Airport to]
- date: YYYY-MM-DD; length:8
- Flight number; length: variable
- Airport From: IATA airport code, length:3
- Airport To: IATA airport code, length:3

如图所示,有时我们需要按照相当特殊的规则解析输入字符串。在这种情况下,我们需要分析需求并实现一个解析器

String dateStr = FLIGHT_INPUT.substring(0, 8);
String flightNo = FLIGHT_INPUT.substring(8, FLIGHT_INPUT.length() - 6);
int airportStart = dateStr.length() + flightNo.length();
String from = FLIGHT_INPUT.substring(airportStart, airportStart + 3);
String to = FLIGHT_INPUT.substring(airportStart + 3);
                                                                               
String[] myArray = new String[] { dateStr, flightNo, from, to };
assertArrayEquals(new String[] { "20221018", "LH720", "FRA", "PEK" }, myArray);

如上代码所示,我们使用 substring() 方法构建了一个解析器,并正确处理了航班输入。

5. 总结

在这篇文章中,我们学习了如何在Java中将字符串转换为字符串数组。

简而言之,将字符串转换为单元素数组非常直观。如果我们需要根据特定规则拆分字符串,可以使用 String.split() 方法。然而,如果需要根据特定规则拆分输入,可能需要仔细分析输入格式,并实现一个解析器来解决问题。

如往常一样,文章中使用的完整代码可在GitHub上找到。