创建集合

时间:2015-08-11 10:40:36

标签: java arrays string tostring stringbuilder

我经常遇到创建对象集合的String表示的任务。

示例:

String[] collection = {"foo", "bar", "lorem", "dolar"};

我想要创建的代表:" foo,bar,lorem,dolar"

每次我遇到这个任务时,我都想知道哪种方法能够获得理想的效果。

我知道有很多方法可以获得所需的表示,但是例如我总是想知道,如果有可能只使用for / each循环来创建字符串吗?

像这样:

StringBuilder builder = new StringBuilder();

for (String tag : list) {
  builder.append(tag + ", ");

String representation = builder.toString();
// but now the String look like this: "foo, bar, lorem, dolar, " which nobody wants

或者最好直接使用迭代器吗?

假设list是一个集合(这是他们在JDK中如何做到这一点):

Iterator<String> it = list.iterator();
while (it.hasNext()) {
  sb.append(it.next());
  if (!it.hasNext()) {
    break;
  }
  sb.append(", ");
}

当然可以使用传统的for循环索引数组或执行许多其他操作。

问题

最简单 / 最佳可读性 / 最安全将字符串列表转换为表达式分隔每个元素的方法是什么一个逗号在开头或结尾处理边缘情况(意味着在第一个元素之前或最后一个元素之后没有逗号)?

8 个答案:

答案 0 :(得分:6)

使用Java 8,您可以:

String listJoined = String.join(",", list);

答案 1 :(得分:1)

使用Java8使用

String joined = Stream.of(collection)
                    //.map(Object::toString) //for non-String elements
                      .collect(Collectors.joining(","));

获取所需的结果或上面传播的String.join。

答案 2 :(得分:1)

我认为最可读的是:

String[] collection = {"foo", "bar", "lorem", "dolar"};
String s = Arrays.asList(collection).toString();
System.out.println(s);

<强>输出

[foo, bar, lorem, dolar]

答案 3 :(得分:0)

你可以试试这种方式

String[] collection = {"foo", "bar", "lorem", "dolar"};    
StringBuilder sb=new StringBuilder();
for(String i:collection){
   sb.append(i);
   sb.append(",");
}
sb.replace(sb.lastIndexOf(","),sb.lastIndexOf(",")+1,"");
System.out.println(sb.toString());

Out put:

foo,bar,lorem,dolar

Java 8中,您可以尝试以下操作。

 String[] collection = {"foo", "bar", "lorem", "dolar"};   
 StringJoiner sj=new StringJoiner(",");
 for(String i:collection){
    sj.add(i);
 }
 System.out.println(sj.toString());

答案 4 :(得分:0)

您可能希望使用Apache Commons&#39; join

public static String join(Iterable iterable,           char分隔符) 将提供的Iterable的元素连接到包含提供的元素的单个String中。 在列表之前或之后不添加分隔符。迭代中的空对象或空字符串由空字符串表示。 请参阅此处的示例:join(Object [],char)。 参数:     iterable - 提供连接在一起的值的Iterable可以为null     separator - 要使用的分隔符 返回:     连接的String,如果为null迭代器输入,则为null

它已经在一个流行的utils包中实现,并且完全按照您在代码中执行的操作。

作为替代实现,仅供讨论,您可能希望在每次迭代时将字符串缓冲区附加到逗号,但在返回字符串时跳过最后一个字符

Iterator<String> it = list.iterator();
while (it.hasNext()) {
  sb.append(it.next());
  sb.append(", ");
}
return sb.substring(0,sb.length()-1);

答案 5 :(得分:0)

您可以使用Arrays.asList函数将数组转换为List对象。

列表上应用的toString函数返回类似

的内容

stringCollection =&#34; [foo,bar,lorem,dolar]&#34;

在这里,您只需删除第一个和最后一个字符&#39; [&#39;和&#39;]&#39;使用子字符串函数。

result =&#34; foo,bar,lorem,dolar&#34;

//This is your String array
String[] collection = {"foo", "bar", "lorem", "dolar"};
//You convert it to a List and apply toString
String stringCollection = Arrays.asList(collection).toString(); 
//Remove the '[' and  ']' fromt the resulted String 
String result = stringCollection.substring(1, stringCollection.length()-1);

答案 6 :(得分:0)

在java8中使用流:

String[] collection = {"foo", "bar", "lorem", "dolar"};    
String output = Arrays.asList(collection ).stream().collect(Collectors.joining(", "));

答案 7 :(得分:0)

使用Apache的公共语言:StringUtils.join(collection , ',');

另一个类似的问题和答案here