【问题标题】:Print out elements from an array with a comma between elements except the last word打印出数组中的元素,除了最后一个单词之外的元素之间用逗号分隔
【发布时间】:2013-08-16 18:10:56
【问题描述】:

我正在打印数组列表中的元素,并且希望在除最后一个单词之外的每个单词之间使用逗号。现在我正在这样做:

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

如你所见,它会打印出这样的文字:one, two, three, four,,问题是最后一个逗号,我该如何解决?感谢所有答案!

【问题讨论】:

  • 我很确定你可以在ArrayList 上调用toString(),它会返回数组中每个元素的toString(),用逗号分隔。如果你不喜欢[],你可以把它们去掉。类似this

标签: java formatting


【解决方案1】:

如果存在,则单独打印第一个单词。然后先将模式打印为逗号,然后是下一个元素。

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]);
}

使用List,最好使用Iterator

// 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。
  • 请注意,如果arrayListWordsLinkedList 而不是ArrayList,那么当它应该是O(n) 时,这将成为O(n^2) 解决方案。
  • Pure ArrayList,Spidey,但感谢您让我知道其中的复杂性!
【解决方案2】:

我会这样写:

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

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

如果 arrayListWords 有两个单词,它应该打印出来 甲,乙

【讨论】:

    【解决方案3】:

    使用 Java 8 流:

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

    【讨论】:

      【解决方案4】:
      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

      【讨论】:

        【解决方案5】:

        在迭代时,您可以将String s 附加到StringBuilder,最后,您可以删除最后两个字符,即额外的, 和一个空格(res.length() -2

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

        【讨论】:

          【解决方案6】:

          有了 Java 8,它变得更容易了,不需要第 3 方 -

          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 的警告:Call "Optional#isPresent()" before accessing the value. 我对 lambda 表达式还不是很有信心,您知道如何在这里使用 .ifPresent() 吗?提前谢谢你。
          【解决方案7】:

          您可以使用 java.util 包中的标准函数并删除开头和结尾处的块引号。

          String str = java.util.Arrays.toString(arrayListWords);
          str = str.substring(1,str.length()-1);
          System.out.println(str);
          

          【讨论】:

            【解决方案8】:

            您可以在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,谢谢。
            【解决方案9】:

            你可以试试这个

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

            【讨论】:

            • 我不会依赖程序逻辑中 ListtoString 值。这可能会因实现而异,从而导致代码中断。
            • 这也会从单词中删除字符,如果任何单词包含 '[' 或 ']' 这将改变单词。
            【解决方案10】:

            只需使用 toString() 方法即可。

            String s = arrayListWords.toString();
            System.out.println(s);
            
            //This will print it like this: "[one, two, three, four]"
            //If you want to remove the brackets you can do so easily. Just change the way you print.
            

            【讨论】:

            • 你能解释一下“你的打印方式”吗?有没有不带括号的打印选项?
            • 用户发帖说这是一个数组列表。您可以在数组列表上使用 toString()。
            • 使用这个:int length = s.length(); s = s.substring(1,length); System.out.println(s);
            • @Erica 你也可以试试这个: s = s.replace("[","").replace("]","");这是执行此操作的一种更短的方法。 :)
            • 好一个@Rahul,这肯定会被使用!
            【解决方案11】:

            这是我想出的:

            String join = "";
            
            // solution 1
            List<String> strList = Arrays.asList(new String[] {"1", "2", "3"});
            for(String s: strList) {
               int idx = strList.indexOf(s);
               join += (idx == strList.size()-1) ? s : s + ",";
            }
            System.out.println(join);
            
            // solution 2 
            join = "";
            for(String s: strList) {    
               join += s + ",";
            }
            
            join = join.substring(0, join.length()-1);
            System.out.println(join);
            
            // solution 3  
            join = "";
            int count = 0;
            for(String s: strList) {    
               join += (count == strlist.size()-1) ? s: s + ",";
               count++;
            }
            
            System.out.println(join);
            

            当然,我们可以使用StringBuilder,但在所有解决方案中,我喜欢@Mav 的答案,因为它更高效、更干净。

            【讨论】:

              【解决方案12】:

              这可能是使用最佳实践和没有“if”检查、没有不熟悉的库和StringBuilder(这是连接字符串的最佳实践)的最有效的逗号分隔字符串方法。

              还有一个“大小”变量可以减少对.size() 方法的调用。

              对于那些使用String[]的人:

              StringBuilder str = new StringBuilder();
              String[] strArr = {"one", "two", "three", "four"};
              int size = strArr.length;
              str.append(strArr[0]);
              for (int i = 1; i < size; i++) {
                  str.append(",").append(strArr[i]);
              }
              System.out.println(str.toString());
              

              对于那些使用ArrayList&lt;String&gt;的人:

              StringBuilder str = new StringBuilder();
              List<String> strArr = Arrays.asList(new String[]{"one", "two", "three", "four"});
              int size = strArr.size();
              str.append(strArr.get(0));
              for (int i = 1; i < size; i++) {
                  str.append(",").append(strArr.get(i));
              }
              System.out.println(str.toString());
              

              两者均产生:one,two,three,four

              【讨论】:

                【解决方案13】:

                由于倒数第二个问题是错误的,这是我编写的一个小方法,用整数数组执行此操作,但转换为字符串数组。

                    public static void printArray(String[] arr){
                    for(int i = 0;i<arr.length;i++){
                        System.out.print(arr[i]);
                        if(i<(arr.length-1))
                            System.out.print(",");
                    }
                }
                

                【讨论】:

                  猜你喜欢
                  • 2013-08-30
                  • 1970-01-01
                  • 2012-05-11
                  • 2014-04-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-06-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多