1. 概述
在Java中,字符串(String
)可能是最常用的类型之一。本教程将探讨如何将字符串转换为字符串数组(String[]
)。
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. 使用 String
的 split()
方法
在处理特定模式的输入字符串时,我们经常需要这样做。 在这种情况下,我们可以使用正则表达式或正则表达式将输入字符串分割成 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()
方法将输入字符串转换为不同类型的字符串数组。一些流行库,如 Guava 和 Apache 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上找到。