在数组中打印元素,元素之间用逗号分隔

24

我正在从一个 ArrayList 中打印元素,并希望在每个单词后面都加上逗号,除了最后一个单词。

目前,我的做法是这样的:

for (String s : arrayListWords) {
    System.out.print(s + ", ");
}

它会像这样打印出这些单词:

one, two, three, four,

问题在于最后一个逗号,我该如何解决?


我相信你可以在你的ArrayList上调用toString(),它将返回数组中每个元素的toString(),并以逗号分隔。如果你不喜欢[],你可以把它们去掉。类似这样 - Josh M
14个回答

34

如果存在第一个单词,请将其单独打印。然后按逗号、第一个元素,再依次打印模式中的下一个元素。

if (arrayListWords.length >= 1) {
    System.out.print(arrayListWords[0]);
}

// note that i starts at 1, since we already printed the element at index 0
for (int i = 1; i < arrayListWords.length, i++) { 
     System.out.print(", " + arrayListWords[i]);
}

使用Iterator更适合使用List

// assume String
Iterator<String> it = arrayListWords.iterator();
if (it.hasNext()) {
    System.out.print(it.next());
}
while (it.hasNext()) {
    System.out.print(", " + it.next());
}

@Erica 你编辑了你的帖子,说它是一个数组列表(或者我读错了)。你需要改变迭代方式以适应List API。 - Sotirios Delimanolis
1
请注意,如果arrayListWords是一个链表而不是一个数组列表,那么这个解决方案将成为一个 O(n^2) 的解决方案,但它应该是一个 O(n) 的解决方案。 - Boris the Spider
纯ArrayList,Spidey,但感谢您让我知道复杂性! - Eri.

20

我会这样写:

String separator = "";  // separator here is your ","

for (String s : arrayListWords) {
    System.out.print(separator + s);
    separator = ",";
}
如果arrayListWords有两个单词,它应该打印出A,B。

17

使用Java 8 Streams:

Stream.of(arrayListWords).collect(Collectors.joining(", "));

int[] int array怎么样?谢谢。 - undefined

6
StringJoiner str = new StringJoiner(", ");
str.add("Aplha").add("Beta").add("Gamma");

String result = str.toString();
System.out.println("The result is: " + result);

输出结果: 结果为:Aplha,Beta,Gamma

3

在迭代过程中,您可以将String s附加到StringBuilder中,在最后,您可以删除最后2个字符,即多余的,和空格(res.length() -2

StringBuilder res = new StringBuilder();
for (String s : arrayListWords) {
    res.append(s).append(", ");
}
System.out.println(res.deleteCharAt(res.length()-2).toString());

2

使用Java 8,变得更加容易,不需要第三方工具 -

final List<String> words = Arrays.asList("one", "two", "three", "four");
Optional<String> wordsAsString = words.stream().reduce((w1, w2) -> w1 + "," + w2);
wordsAsString.ifPresent(System.out::println); 

你的解决方案按预期工作,但是我收到了SonarLint的警告:在访问值之前调用“Optional#isPresent()”。 我对lambda表达式还不是非常自信,你知道如何在这里使用.ifPresent()吗?提前感谢你。 - metters

1
你可以使用java.util包中的标准函数,并删除开头和结尾的引用块。
String str = java.util.Arrays.toString(arrayListWords);
str = str.substring(1,str.length()-1);
System.out.println(str);

0

它也可以使用Java 8的static方法String.join()来实现,有两种方式。

返回一个由CharSequence元素的副本与指定delimiter的副本拼接而成的新String

这两个版本的第一个参数都是delimiter,类型为CharSequence,第二个参数可以是varargsCharSequence或者Iterable<? extends CharSequence>

这两个方法在内部生成一个byte数组,根据提供的elementsdelimiter的编码将其填充,并将其转换为结果String

使用示例:String.join(CharSequence,CharSequence...)

String[] strings = {"one", "two", "three", "four"};

String joinedStr = String.join(", ", strings); // "one, two, three, four" - resulting String

使用示例{{link1:String.join(CharSequence,Iterable<? extends CharSequence>)}}:

List<String> strings = List.of("one", "two", "three", "four");

String joinedStr = String.join(", ", strings); // "one, two, three, four" - resulting String

0

你可以在 List 上使用 Iterator 来检查是否有更多的元素。

然后只有当当前元素不是最后一个元素时,你才可以追加逗号。

public static void main(String[] args) throws Exception {
    final List<String> words = Arrays.asList(new String[]{"one", "two", "three", "four"});

    final Iterator<String> wordIter = words.iterator();
    final StringBuilder out = new StringBuilder();
    while (wordIter.hasNext()) {
        out.append(wordIter.next());
        if (wordIter.hasNext()) {
            out.append(",");
        }
    }
    System.out.println(out.toString());
}

然而,使用第三方库(如Guava)来为您完成此操作要容易得多。代码将变为:

public static void main(String[] args) throws Exception {
    final List<String> words = Arrays.asList(new String[]{"one", "two", "three", "four"});
    System.out.println(Joiner.on(",").join(words));
}

当我变得更有经验时,我会查看Guava,谢谢。 - Eri.

0
你可以试试这个。
    List<String> listWords= Arrays.asList(arrayListWords); // convert array to List
    StringBuilder sb=new StringBuilder();
    sb.append(listWords);
    System.out.println(sb.toString().replaceAll("\\[|\\]",""));

1
我不会依赖于程序逻辑中List的toString值。这可能因实现而异,导致代码出错。 - Boris the Spider
2
也会删除单词中的字符,如果任何一个单词包含 '[' 或 ']',则会更改该单词。 - Asaf

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