用逗号分隔列表的最简单方法?

问题描述 投票:100回答:30

用Java逗号分隔列表的最清晰方法是什么?

我知道几种方法,但是我想知道最好的方法是什么(“最好”是指最清晰和/或最短而不是最有效的方法。

我有一个列表,我想遍历它,打印每个值。我想在每个项目之间打印一个逗号,但不要在最后一个项目之后(也不在第一个项目之前)。

List --> Item ( , Item ) *
List --> ( Item , ) * Item

示例解决方案1:

boolean isFirst = true;
for (Item i : list) {
  if (isFirst) {
    System.out.print(i);        // no comma
    isFirst = false;
  } else {
    System.out.print(", "+i);   // comma
  }
}

示例解决方案2-创建子列表:

if (list.size()>0) {
  System.out.print(list.get(0));   // no comma
  List theRest = list.subList(1, list.size());
  for (Item i : theRest) {
    System.out.print(", "+i);   // comma
  }
}

示例解决方案3:

  Iterator<Item> i = list.iterator();
  if (i.hasNext()) {
    System.out.print(i.next());
    while (i.hasNext())
      System.out.print(", "+i.next());
  }

这些特别对待第一项;可以改而特别地对待最后一个。

顺便说一下,这是在Java 1.6中实现ListtoStringis

的方法(继承自AbstractCollection):
public String toString() {
    Iterator<E> i = iterator();
    if (! i.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = i.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! i.hasNext())
            return sb.append(']').toString();
        sb.append(", ");
    }
}

它会尽早退出循环以避免最后一项后面的逗号。顺便说一句:这是我第一次记得看到“(本收藏集)”;这是激发它的代码:

List l = new LinkedList();
l.add(l);
System.out.println(l);

我欢迎任何解决方案,即使它们使用意外的库(regexp?);以及其他非Java语言的解决方案(例如,我认为Python / Ruby具有intersperse

函数-that如何实现?)。

Clarification

:库,我的意思是标准Java库。对于其他库,我认为它们与其他语言一起使用,并且有兴趣知道它们是如何实现的。

EDIT

工具包提到了类似的问题:Last iteration of enhanced for loop in java

还有另一个:Does the last element in a loop deserve a separate treatment?

用Java逗号分隔列表的最清晰方法是什么?我知道这样做的几种方法,但是我想知道最好的方法是什么(“最佳”是指最清晰和/或最短,而不是最有效。...

java pretty-print
30个回答
216
投票

Java 8及更高版本


3
投票

foreach循环的一个选项是:


2
投票
Iterator i = list.iterator();
for (;;) {
  sb.append(i.next());
  if (! i.hasNext()) break;
  ab.append(", ");
}

2
投票

我通常这样做:


2
投票

如果可以使用Groovy(在JVM上运行):


2
投票

(从List<String> list = Arrays.asList(array); String joinedString = String.join(",", list); 复制我自己的答案的粘贴。)这里描述的许多解决方案有点过头了,恕我直言,特别是那些依赖于外部库的解决方案。有一个很好的干净清晰的习惯用法,用于实现我一直使用的逗号分隔列表。它依赖于条件(?)运算符:


1
投票

我通常使用与版本3类似的东西。它在c / c ++ / bash / ...:P下工作良好。


1
投票

我没有编译它,但是应该可以工作(或即将开始工作)。


1
投票

这很简短,很清楚,但给我的感觉带来了恐怖的恐惧。适应不同的分隔符也有些尴尬,尤其是在使用String(不是char)的情况下。


1
投票

1
投票

我有点喜欢这种方法,前一段时间我在博客上发现了这种方法。不幸的是,我不记得博客的名称/ URL。


82
投票
return list.stream().
       map(Object::toString).
       collect(Collectors.joining(",")).toString();

1
投票

因为您的分隔符为“,”,所以可以使用以下任意一种:


1
投票

我喜欢这个解决方案:


0
投票

在Python中很容易


0
投票

您还可以无条件地添加定界符字符串,并在循环之后在末尾删除多余的定界符。然后,开头的“如果列表为空则返回此字符串”将使您避免在末尾进行检查(因为您无法从空白列表中删除字符)



0
投票
StringBuffer sb = new StringBuffer();

for (int i = 0; i < myList.size(); i++)
{ 
    if (i > 0) 
    {
        sb.append(", ");
    }

    sb.append(myList.get(i)); 
}

0
投票
public class StringDelim {

    public static void removeBrackets(String string) {
        System.out.println(string.substring(1, string.length() - 1));
    }

    public static void main(String... args) {
        // Array.toString() example
        String [] arr = {"Hi" , "My", "name", "is", "br3nt"};
        String string = Arrays.toString(arr);
        removeBrackets(string);

        // List#toString() example
        List<String> list = new ArrayList<String>();
        list.add("Hi");
        list.add("My");
        list.add("name");
        list.add("is");
        list.add("br3nt");
        string = list.toString();
        removeBrackets(string);

        // Map#values().toString() example
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("1", "Hi");
        map.put("2", "My");
        map.put("3", "name");
        map.put("4", "is");
        map.put("5", "br3nt");
        System.out.println(map.values().toString());
        removeBrackets(string);

        // Enum#toString() example
        EnumSet<Days> set = EnumSet.allOf(Days.class);
        string = set.toString();
        removeBrackets(string);
    }

    public enum Days {
        MON("Monday"),
        TUE("Tuesday"),
        WED("Wednesday"),
        THU("Thursday"),
        FRI("Friday"),
        SAT("Saturday"),
        SUN("Sunday");

        private final String day;

        Days(String day) {this.day = day;}
        public String toString() {return this.day;}
    }
}

0
投票

到目前为止,没有答案使用递归...


0
投票

我认为,这是最简单的阅读和理解:


0
投票
if (array.length>0)          // edited in response Joachim's comment
  sb.append(array[i]);
for (int i=1; i<array.length; i++)
  sb.append(",").append(array[i]);

32
投票

Java 8提供了几种新的方法:


-1
投票

方法


18
投票
joining

7
投票

如果使用Spring Framework,则可以使用StringJoiner


6
投票

基于Java的List toString实现:


4
投票
Joiner.on(",").join(myList)

4
投票

有一种使用Java 8实现此目的的不错方法:


3
投票
© www.soinside.com 2019 - 2024. All rights reserved.