用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中实现List
toString
is
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(", "); } }
它会尽早退出循环以避免最后一项后面的逗号。顺便说一句:这是我第一次记得看到“(本收藏集)”;这是激发它的代码:
函数-that如何实现?)。List l = new LinkedList(); l.add(l); System.out.println(l);
我欢迎任何解决方案,即使它们使用意外的库(regexp?);以及其他非Java语言的解决方案(例如,我认为Python / Ruby具有intersperse
Clarification
:库,我的意思是标准Java库。对于其他库,我认为它们与其他语言一起使用,并且有兴趣知道它们是如何实现的。EDIT
工具包提到了类似的问题:Last iteration of enhanced for loop in java还有另一个:Does the last element in a loop deserve a separate treatment?
用Java逗号分隔列表的最清晰方法是什么?我知道这样做的几种方法,但是我想知道最好的方法是什么(“最佳”是指最清晰和/或最短,而不是最有效。...
foreach循环的一个选项是:
Iterator i = list.iterator();
for (;;) {
sb.append(i.next());
if (! i.hasNext()) break;
ab.append(", ");
}
我通常这样做:
如果可以使用Groovy(在JVM上运行):
(从List<String> list = Arrays.asList(array);
String joinedString = String.join(",", list);
复制我自己的答案的粘贴。)这里描述的许多解决方案有点过头了,恕我直言,特别是那些依赖于外部库的解决方案。有一个很好的干净清晰的习惯用法,用于实现我一直使用的逗号分隔列表。它依赖于条件(?)运算符:
我通常使用与版本3类似的东西。它在c / c ++ / bash / ...:P下工作良好。
我没有编译它,但是应该可以工作(或即将开始工作)。
这很简短,很清楚,但给我的感觉带来了恐怖的恐惧。适应不同的分隔符也有些尴尬,尤其是在使用String(不是char)的情况下。
我有点喜欢这种方法,前一段时间我在博客上发现了这种方法。不幸的是,我不记得博客的名称/ URL。
return list.stream().
map(Object::toString).
collect(Collectors.joining(",")).toString();
因为您的分隔符为“,”,所以可以使用以下任意一种:
我喜欢这个解决方案:
在Python中很容易
您还可以无条件地添加定界符字符串,并在循环之后在末尾删除多余的定界符。然后,开头的“如果列表为空则返回此字符串”将使您避免在末尾进行检查(因为您无法从空白列表中删除字符)
StringBuffer sb = new StringBuffer();
for (int i = 0; i < myList.size(); i++)
{
if (i > 0)
{
sb.append(", ");
}
sb.append(myList.get(i));
}
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;}
}
}
到目前为止,没有答案使用递归...
我认为,这是最简单的阅读和理解:
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]);
Java 8提供了几种新的方法:
joining
如果使用Spring Framework,则可以使用StringJoiner
:
基于Java的List toString实现:
Joiner.on(",").join(myList)
有一种使用Java 8实现此目的的不错方法: