【发布时间】:2012-04-09 12:15:05
【问题描述】:
我只是想知道从列表的所有元素中删除空白的最佳方法是什么。
例如,如果我有String [] array = {" String", "Tom Selleck "," Fish "}
我怎样才能得到所有元素为{"String","Tom Selleck","Fish"}
谢谢!
【问题讨论】:
我只是想知道从列表的所有元素中删除空白的最佳方法是什么。
例如,如果我有String [] array = {" String", "Tom Selleck "," Fish "}
我怎样才能得到所有元素为{"String","Tom Selleck","Fish"}
谢谢!
【问题讨论】:
试试这个:
String[] trimmedArray = new String[array.length];
for (int i = 0; i < array.length; i++)
trimmedArray[i] = array[i].trim();
现在trimmedArray 包含与array 相同的字符串,但没有前导和尾随空格。或者,您可以编写此代码以在同一数组中就地修改字符串:
for (int i = 0; i < array.length; i++)
array[i] = array[i].trim();
【讨论】:
另一个 java 8 lambda 选项:
String[] array2 = Arrays.stream(array).map(String::trim).toArray(String[]::new);
以及没有创建新数组的丑陋但优化的版本
Arrays.stream(array).map(String::trim).toArray(unused -> array);
原来的“数组”被修改了。
【讨论】:
"Local variable array defined in an enclosing scope must be final or effectively final" 换句话说,数组是由java在一个循环中定义的:for (String[] array; (array = reader.readNext()) != null;) {
在您的应用程序构建路径中添加 commons-lang3-3.1.jar。 使用下面的代码 sn-p 修剪字符串数组。
String array = {" String", "Tom Selleck "," Fish "};
array = StringUtils.stripAll(array);
【讨论】:
在 Java 8 中,Arrays.parallelSetAll 似乎已为此目的做好了准备:
import java.util.Arrays;
Arrays.parallelSetAll(array, (i) -> array[i].trim());
这将修改原始数组,将每个元素替换为 lambda 表达式的结果。
【讨论】:
我知道这是一篇很老的帖子,但是从 Java 1.8 开始,有一种更好的方法可以修剪数组中的每个字符串。
Java 8 Lamda 表达式解决方案:
List<String> temp = new ArrayList<>(Arrays.asList(yourArray));
temp.forEach(e -> {temp.set((temp.indexOf(e), e.trim()});
yourArray = temp.toArray(new String[temp.size()]);
使用此解决方案,您不必创建新数组。
就像 Óscar López 的解决方案一样
【讨论】:
temp.forEach(e -> { temp.set(temp.indexOf(e), s.trim()); });,否则它会给我一个语法错误。
indexOf 查找索引对性能来说很糟糕,如果有重复的元素会失败!
您可以遍历数组中的元素并在每个元素上调用array[i].trim()
【讨论】:
array[i]!!!!否则迭代将无效。
array[i] 中。根据 OP 的需要,将它们存储在第二个数组中可能会更好
to remove the white space from all the elements ...] 表明他想用修剪过的字符串覆盖当前值,所以如果确实如此 - 您需要将其存储回 array[i]
对于那些(像我一样)在 Kotlin 中寻找相同解决方案并且只指向 Java 的人 - 如何在 Kotlin 中进行修剪:
fun main(args: Array<String>) {
// array definition
val array = arrayListOf<String>(" String", "Tom Selleck "," Fish ")
println(array) // print original -> [ String, Tom Selleck , Fish ]
// remove leading and trailing spaces, result is arrayList
val sol1 = array.map { it.trim() }
println("sol1 = $sol1") // -> sol1 = [String, Tom Selleck, Fish]
// remove leading and trailing spaces, result is String
val sol2 = array.joinToString { it.trim() }
println("sol2 = $sol2") // -> sol2 = String, Tom Selleck, Fish
}
【讨论】:
不知道 OP 一开始是如何将{" String", "Tom Selleck "," Fish "} 放在一个数组中的(6 年前),我想我会分享我最终得到的结果。
我的数组是在分隔符周围可能有额外空格的字符串上使用 split 的结果。我的解决方案是在分裂的时候解决这个问题。我的代码如下。测试后,我将 splitWithTrim() 放入项目的 Utils 类中。它处理我的用例;如果您决定使用它,您可能需要考虑可能会遇到哪些类型的字符串和分隔符。
public class Test {
public static void main(String[] args) {
test(" abc def ghi jkl ", " ");
test(" abc; def ;ghi ; jkl; ", ";");
}
public static void test(String str, String splitOn) {
System.out.println("Splitting \"" + str + "\" on \"" + splitOn + "\"");
String[] parts = splitWithTrim(str, splitOn);
for (String part : parts) {
System.out.println("(" + part + ")");
}
}
public static String[] splitWithTrim(String str, String splitOn) {
if (splitOn.equals(" ")) {
return str.trim().split(" +");
} else {
return str.trim().split(" *" + splitOn + " *");
}
}
}
运行测试应用程序的输出是:
Splitting " abc def ghi jkl " on " "
(abc)
(def)
(ghi)
(jkl)
Splitting " abc; def ;ghi ; jkl; " on ";"
(abc)
(def)
(ghi)
(jkl)
【讨论】:
String val = "hi hello prince";
String arr[] = val.split(" ");
for (int i = 0; i < arr.length; i++)
{
System.out.print(arr[i]);
}
【讨论】: