将字符列表ArrayList转换为字符串?

41

如何在Java中将ArrayList<Character>转换为String

List.toString方法会将其转换为带有方括号的字符串[a,b,c],我想去掉方括号等符号,并将其存储为abc

12个回答

40
你可以遍历列表并创建字符串。
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内容的可读格式。从中过滤掉不必要的字符并不值得。它的实现可能在明天改变,你将不得不重写你的过滤代码。


使用StringBuilder和toString方法相比仅使用String类的优点是什么? - Line
1
@Line - 使用StringBuilder更有效率。使用朴素的字符串拼接方式添加N个字符的时间复杂度为O(N^2)。如果你考虑使用ArrayList.toString()和过滤,那么过滤步骤需要再次对字符串进行O(N)的遍历...相比之下,单次遍历方法更优^^^。 - Stephen C

30

这里是使用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方法


在我的情况下,我必须进行类型转换: String str = (String)(chars.stream().map(e->e.toString()).collect(Collectors.joining())); - Abhishek Thapliyal

2
这样怎么样,构建列表。
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);

如果有错误,请指出,我还在学习中。


7
使用 StringBuilder 比字符串拼接更高效,这句话没有错误。 - Giuseppe
2
这是一个O(N^2)的解决方案,因为每个字符串连接都会复制整个字符串...到目前为止。更好的解决方案是O(N) - Stephen C

1

您可以使用toString()和RegExp而不需要任何循环和流来完成:

List<Character> list = Arrays.asList('a', 'b', 'c'); String s = list.toString().replaceAll("[,\\s\\[\\]]", "");


该代码段演示了如何将Java中的List转换为字符串并删除其中的所有空格和逗号。

26
这是个糟糕的想法。 - shmosel
4
创意应该得到奖励 :) - Milo van der Zee

1
假设您有以下列表:
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));

为什么在标准库可以胜任的情况下要使用第三方库? - mre
2
有没有一个标准的方法可以像ArrayUtils#toPrimitive一样做同样的事情?我知道这个问题可以用不同的方法来解决,我只是问一下我选择的这个特定方法,以避免使用显式循环。此外,我无法想象现在的CLASSPATH上没有commons-lang... - Tomasz Nurkiewicz

1
使用 Joiner 类的 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()); 

0

有很多解决方案可供选择。您可以迭代字符并将其附加到 StringBuilder 上,然后在完成附加后,在 StringBuilder 上调用 .toString。

或者使用像 Apache Commons-Lang 项目中的 commons-lang StringUtils.join 这样的东西。


最简单的解决方案是使用正则表达式。 - mre

0

最简单的方法是循环遍历。

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);

尽管从问题的示例来看,他们不想要逗号,所以你可以通过去掉它们并删除最后一行来使它更简单。 - James Allardice
@James - 是的,我没有注意到! - adarshr

0

对 @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());

-1

我认为这是一种简单而聪明的方式

 // 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"

如果有任何字符是“,”或空格,则无法正常工作。 - Ry-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接