将List <string>转换为String </string>的最佳方法是什么?

时间:2014-11-14 02:35:55

标签: java string arraylist

所以我一直在回顾我差不多一年半前写的代码,试图修复它,我发现这个功能让我感到困惑。我搜索了一个方法来做同样的事情,发现了一个相当不错的功能,我很好奇什么会更好。

功能A:

public static String listToString(List<String> list){
    StringBuilder sb = new StringBuilder();
    if (list != null && list.size() > 1){
        sb.append(list.get(0));
        for (int i = 1; i < list.size(); i++){
            sb.append(", " + list.get(i));
        }
    }else if(list != null && (list.size() == 1)){
        sb.append(list.get(0));
    }
    return sb.toString();
}

功能B:

public static String listToString(List<String> list) {
    String str = "";
    for (String s : list) {
        str += s + ", ";
    }
    return str;
}

现在我在学习Java的前几个月内编写了函数A,所以我可能不太了解,但是我有什么理由坚持使用这种方法吗?

4 个答案:

答案 0 :(得分:1)

函数A是首选,因为它只使用一个StringBuilder实例,而函数B中的代码在循环中执行

str += s + ", ";

相当于

str = new StringBuilder(str).append(s).append(", ").toString();

所以在每次迭代中你必须:

  • 创建新的StringBuilder
  • 将当前字符串的内容复制到此StringBuilder
  • 现在您可以添加", "s
  • 根据StringBuilder的当前内容创建并返回新的String

(所以在每次迭代中你需要再次读取整个字符串,然后再次......)在场景B中你只需要专注于为单个StringBuilder添加新字符


无论如何,自Java 8以来,你不需要把重点放在编写可以连接字符串集合的方法上。你可以简单地使用StringJoiner类或简单地调用
来自String类的join(CharSequence delimiter, Iterable<? extends CharSequence> elements)方法将为您使用StringJoiner。此方法的代码如下所示:

public static String join(CharSequence delimiter,
        Iterable<? extends CharSequence> elements) {
    Objects.requireNonNull(delimiter);
    Objects.requireNonNull(elements);
    StringJoiner joiner = new StringJoiner(delimiter);
    for (CharSequence cs: elements) {
        joiner.add(cs);
    }
    return joiner.toString();
}

请注意,Objects.requireNonNull(delimiter);会在null的情况下抛出NPE,因此如果您想避免它,您可以编写自己的此方法版本并将此测试替换为更像

的内容。
if (delimiter==null || elements==null) return "";

或者如果您想允许分隔符为空

if (elements==null) return "";
if (delimiter == null) delimiter = "";//use empty string as delimiter 

答案 1 :(得分:1)

Apache的公共语言,只需附加

 StringUtils.join(list);

或  按字符分隔。

StringUtils.join(java.lang.Iterable,char)

Java 8.0 以后,第一个参数是分开元素

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

答案 2 :(得分:1)

检查番石榴上的Joiner

    String s= Joiner.on(",").join(lists);

检查以下输出测试

    List<String> lists=new ArrayList<String>();
    lists.add("a1");
    lists.add("a2");
    lists.add("a3");
    lists.add("a4");
    String s = Joiner.on(",").join(lists);
    System.out.println(s);

输出中:

a1,a2,a3,a4

答案 3 :(得分:0)

除了使用库,您还可以使用

(我经常看到的模式)

public static String listToString(List<String> list) {
    StringBuilder sb = new StringBuilder();
    boolean first = true;
    for (String string : list) {
        if (first)
            first = false;
        else
            sb.append(", ");
        sb.append(string);
    }
    return sb.toString();
}

(也很常见)

public static String listToString(List<String> list) {
    StringBuilder sb = new StringBuilder();
    String separator = "";
    for (String string : list) {
        sb.append(separator).append(string);
        separator = ", ";
    }
    return sb.toString();
}

(最短,有点难读)

public static String listToString(List<String> list) {
    StringBuilder sb = new StringBuilder();
    for (Iterator<String> iterator = list.iterator(); iterator.hasNext();)
        sb.append(iterator.next()).append(iterator.hasNext() ? ", " : "");
    return sb.toString();
}

(可能是最快的,因为循环中没有额外的条件跳转)

public static String listToString(List<String> list) {
    StringBuilder sb = new StringBuilder();
    Iterator<String> iterator = list.iterator();
    if (iterator.hasNext()) {
        sb.append(iterator.next());
        while (iterator.hasNext())
            sb.append(", ").append(iterator.next());
    }
    return sb.toString();
}

或其他可读的东西像B一样短,但使用StringBuilder。您不想要的是循环中的+字符串连接。这会创建临时对象。