如何在Java中将ArrayList<Character>
转换为String
?
List.toString
方法会将其转换为带有方括号的字符串[a,b,c]
,我想去掉方括号等符号,并将其存储为abc
。
如何在Java中将ArrayList<Character>
转换为String
?
List.toString
方法会将其转换为带有方括号的字符串[a,b,c]
,我想去掉方括号等符号,并将其存储为abc
。
String getStringRepresentation(ArrayList<Character> list)
{
StringBuilder builder = new StringBuilder(list.size());
for(Character ch: list)
{
builder.append(ch);
}
return builder.toString();
}
将StringBuilder
的容量设置为列表大小是一种重要的优化。如果不这样做,一些append
调用可能会触发内部重新调整字符串缓冲区。
另外,toString()
返回一个ArrayList内容的可读格式。从中过滤掉不必要的字符并不值得。它的实现可能在明天改变,你将不得不重写你的过滤代码。
这里是使用Java8流的一个可能的一行解决方案。
a)将Character对象列表转换为字符串:
String str = chars.stream()
.map(e->e.toString())
.reduce((acc, e) -> acc + e)
.get();
b) 字符数组(char[] chars)String str = Stream.of(chars)
.map(e->new String(e))
.reduce((acc, e) -> acc + e)
.get();
更新(参见下面的评论):
a)将Character对象列表转换为字符串:
String str = chars.stream()
.map(e->e.toString())
.collect(Collectors.joining());
b) 字符数组(char[] chars)String str = Stream.of(chars)
.map(e->new String(e))
.collect(Collectors.joining());
请注意,上述解决方案中的map(e->e.toString())
步骤将为列表中的每个字符创建临时字符串。这些字符串立即变为垃圾。因此,如果转换的性能是一个相关的问题,你应该考虑使用StringBuilder
方法。
List<Character> charsList = new ArrayList<Character>();
charsList.add('h');
charsList.add('e');
charsList.add('l');
charsList.add('l');
charsList.add('o');
从字符列表中获取字符串的实际代码:
String word= new String();
for(char c:charsList){
word= word+ c;
}
System.out.println(word);
如果有错误,请指出,我还在学习中。
O(N^2)
的解决方案,因为每个字符串连接都会复制整个字符串...到目前为止。更好的解决方案是O(N)
。 - Stephen C您可以使用toString()和RegExp而不需要任何循环和流来完成:
List<Character> list = Arrays.asList('a', 'b', 'c');
String s = list.toString().replaceAll("[,\\s\\[\\]]", "");
final ArrayList<Character> charsList = new ArrayList<Character>();
charsList.add('h');
charsList.add('e');
charsList.add('l');
charsList.add('l');
charsList.add('o');
hello
(我正在使用 org.apache.commons.lang.ArrayUtils
帮助类):final Character[] charactersArray =
charsList.toArray(new Character[charsList.size()]);
final char[] charsArray = ArrayUtils.toPrimitive(charactersArray);
System.out.println(String.valueOf(charsArray));
ArrayUtils#toPrimitive
一样做同样的事情?我知道这个问题可以用不同的方法来解决,我只是问一下我选择的这个特定方法,以避免使用显式循环。此外,我无法想象现在的CLASSPATH上没有commons-lang
... - Tomasz NurkiewiczJoiner
类的 join
方法:// create character list and initialize
List<Character> arr = Arrays.asList('a', 'b', 'c');
String str = Joiner.on("").join(arr);
System.out.println(str);
toString
然后移除 ,和空格
。import com.google.common.base.Joiner;
....
<Character> arr = Arrays.asList('h', 'e', 'l', 'l', 'o');
// remove [] and spaces
String str = arr.toString()
.substring(1, 3 * str.size() - 1) //3 bcs of commas ,
.replaceAll(", ", "");
System.out.println(str);
或者使用流:
import java.util.stream.Collectors;
...
// using collect and joining() method
String str = arr.stream().map(String::valueOf).collect(Collectors.joining());
有很多解决方案可供选择。您可以迭代字符并将其附加到 StringBuilder 上,然后在完成附加后,在 StringBuilder 上调用 .toString。
或者使用像 Apache Commons-Lang 项目中的 commons-lang StringUtils.join 这样的东西。
最简单的方法是循环遍历。
List<String> strings = new ArrayList<String>();
// populate strings
StringBuilder builder = new StringBuilder();
for(String string : strings) {
builder.append(string).append(',');
}
if(builder.length() > 0) {
builder.deleteCharAt(builder.length() - 1);
}
System.out.println(builder);
对 @waggledans 的回答的一个小补充
a) 将字符对象列表转换为字符串:
String str = chars.stream().map(e->e.toString()).collect(Collectors.joining());
可以用 Object::toString
替换 e->e.toString()
String str = chars.stream().map(Object::toString).collect(Collectors.joining());
我认为这是一种简单而聪明的方式
// given list containing the chars
List<Character> arr = Arrays.asList('a', 'b', 'c');
//convert list to string
String output = arr.toString().replaceAll("[ ,]","")
.substring(1, tmpArr.length()-1);
解释:
// convert to string.
String str = arr.toString(); // result is "[a ,b ,c]"
// get rid of the start and the end char i.e '[' & ']'
str = str.substring(1, tmpArr.length()-1); //result is "a ,b ,c"
// replace <space> and ','
str = str.replaceAll(" ,","") "ABC"
StringBuilder
更有效率。使用朴素的字符串拼接方式添加N
个字符的时间复杂度为O(N^2)
。如果你考虑使用ArrayList.toString()
和过滤,那么过滤步骤需要再次对字符串进行O(N)
的遍历...相比之下,单次遍历方法更优^^^。 - Stephen C