本题是一道基础的程序应用题,我们将利用数组和字符串来解答这道题目,以便加深我们对其的理解与掌握
分割拆分字符串原题:
给你一个字符串数组 words
和一个字符 separator
,请你按 separator
拆分 words
中的每个字符串。
返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串 。
默认代码格式:
class Solution {
public List<String> splitWordsBySeparator(List<String> words, char separator) {
}
}
注意事项:
separator
用于决定拆分发生的位置,但它不包含在结果字符串中。- 拆分可能形成两个以上的字符串。
- 结果字符串必须保持初始相同的先后顺序。
示例:
示例 1:
输入:words = ["one.two.three","four.five","six"], separator = "." 输出:["one","two","three","four","five","six"] 解释:在本示例中,我们进行下述拆分: "one.two.three" 拆分为 "one", "two", "three" "four.five" 拆分为 "four", "five" "six" 拆分为 "six" 因此,结果数组为 ["one","two","three","four","five","six"] 。
示例 2:
输入:words = ["$easy$","$problem$"], separator = "$" 输出:["easy","problem"] 解释:在本示例中,我们进行下述拆分: "$easy$" 拆分为 "easy"(不包括空字符串) "$problem$" 拆分为 "problem"(不包括空字符串) 因此,结果数组为 ["easy","problem"] 。
示例 3:
输入:words = ["|||"], separator = "|" 输出:[] 解释:在本示例中,"|||" 的拆分结果将只包含一些空字符串,所以我们返回一个空数组 [] 。
以上便是这道题目所要求的输出结果,我们需要将输入的字符串从输出端口输出时删除
常规做法:
class Solution {
public List<String> splitWordsBySeparator(List<String> words, char separator) {
List<String> res = new ArrayList<String>(); //创建一个数组列表来存放输入结果
for (String word : words) {
StringBuilder sb = new StringBuilder(); //创建一个stringbuilder来构建结果
int length = word.length(); //获取单前字符长度
for (int i = 0; i < length; i++) {
char c = word.charAt(i); //获取
if (c == separator) {
if (sb.length() > 0) {
res.add(sb.toString()); //字符串添加其中
sb.setLength(0);
}
} else {
sb.append(c);
}
}
if (sb.length() > 0) { //检查是否有剩余字符串
res.add(sb.toString());
}
}
return res; //返回结果字符串列表
}
}
大佬一行流:
class Solution {
public List<String> splitWordsBySeparator(List<String> words, char separator) {
return words.stream().map(e->e.split("\\"+String.valueOf(separator))).flatMap(Arrays::stream).filter(e->e.length()>0).collect(Collectors.toList());
}
}
gpt给出对这段代码的解释是:
这段代码使用Java 8中的Stream API来实现字符串分割的功能。下面是对代码中使用的方法和原理的解释:
-
words.stream()
:将输入的List转换为一个Stream对象,这样我们可以对其中的元素进行操作。 -
.map(e->e.split("\\"+String.valueOf(separator)))
:使用map
方法,将每个元素(即每个字符串)分割成一个String数组。这里使用了split
方法来进行分割,使用的分割符是传入的separator
字符。需要注意的是,由于split
方法接受的是一个正则表达式,为了正确地使用separator
作为分割符,我们需要将其转义为一个正则表达式的字符,所以使用了"\\"+String.valueOf(separator)
的方式。 -
.flatMap(Arrays::stream)
:使用flatMap
方法,将每个数组中的元素展平成一个新的Stream。这样,我们就可以将每个分割后的字符串都作为一个新的元素,而不是一个数组中的元素。 -
.filter(e->e.length()>0)
:使用filter
方法,过滤掉长度为0的字符串。这样可以确保最终的结果中不包含空字符串。 -
.collect(Collectors.toList())
:使用collect
方法,将Stream中的元素收集到一个List中,并返回该List作为结果。
题目出自leetcode,仅供参考