【问题标题】:do not want to print comma in the end最后不想打印逗号
【发布时间】:2012-01-24 22:12:52
【问题描述】:

我正在遍历一个应该以这种方式显示的数组:

    k,j,i,h,g,f,e,d,c,b,a,
a,a,a,a,a,a,a,a,a,a,a,
b,b,b,b,b,a,a,a,a,a,a,
z,y,x,w,v,u,t,s,r,q,p,

但最后没有逗号。这就是我目前正在做的事情。

for ( int k = 0;  k < lineChar.length;  k++ ) //for printing in reverse order
            {
                if(lineChar[n] != ','){

                System.out.print(lineChar[n]);
                if(k == lineChar.length-1)
                   System.out.print("");
                else
                   System.out.print(",");

                --n;
                }
            }
            System.out.println();

【问题讨论】:

  • 我发现最简单的方法是使用 StringBuffer 来构建我最终要打印的字符串,在 每个 项(甚至是第一个)之前放置一个逗号,然后最后,在循环完成后,使用一个 .print() 语句从第二个字符开始打印整个 StringBuffer。这样我就不需要任何if/else 结构或循环内的其他测试。顺便说一句,您不需要在当前的if 分支中打印空字符串。
  • 您可以使用 3rd 方库吗?还是您想自己编写代码?

标签: java arrays string char


【解决方案1】:

试试这个,效率很高,因为它只在最后打印一次,使用StringBuilder 构建字符串,不检查循环内的任何条件,并且不需要任何外部库:

public static void printChar(char[] array) {
    if (array == null || array.length == 0)
        return;
    StringBuilder sb = new StringBuilder().append(array[0]);
    for (int i = 1; i < array.length; i++)
        sb.append(',').append(array[i]);
    System.out.println(sb);
}

【讨论】:

  • 我最喜欢这个,但我会做一个改变。从最后一行删除对toString 的调用,因为println 无论如何都会调用对象的toString 方法。
【解决方案2】:
int n=lineChar.lenght-1;

//Next 2 lines are edit after comment by @aix
while ((lineChar[n]==',') && (n>=0)) n--;
if (n>=0) System.out.print(lineChar[n--]);

for (;  n >=0;  n-- ) {
  if(lineChar[n] != ',') {
    System.out.print(",");
    System.out.print(lineChar[n]);
  }
}

【讨论】:

  • 如果lineChar[lineChar.length-1]==',' 怎么办? OP 的代码不会将其打印出来,而您的代码会。
  • 如果第一个字符是“,”怎么办?
  • @Adam 如果第一个字符是“,”,则不会打印,在循环中是最后一个,所以if(lineChar[n] != ',')applies。如果最后一个字符是“,”,我在@aix 反馈后的编辑会捕捉到它
【解决方案3】:

你也应该看看 Guava 的 Joiner 类:http://docs.guava-libraries.googlecode.com/git-history/v11.0.1/javadoc/com/google/common/base/Joiner.html

您的示例简化为以下内容:

System.out.println(Joiner.on(',').join(lineChar));

【讨论】:

    【解决方案4】:

    我会为此使用StringBuilder

    StringBuilder sb = new StringBuilder();
    for (int n = lineChar.length - 1; n >= 0; --n) {
       if (lineChar[n] != ',') {
          if (sb.length() > 0) {
             sb.append(',');
          }
          sb.append(lineChar[n]);
       }
    }
    System.out.println(sb.toString());
    

    我假设if (lineChar[n] != ',') 是为了防止打印任何可能是数组一部分的逗号。如果出于其他原因,请说明其目的。

    【讨论】:

      【解决方案5】:

      我喜欢使用具有初始空值的分隔符变量。然后我在每个元素前面打印分隔符,然后分配真正的分隔符标记:

      String delimiter = "";
      for( int i=0; i<lineChar.length; i++ ) {
          System.out.print( delimiter );
          System.out.print( lineChar[ i ] );
          delimiter = ",";
      }
      

      这样我在每一轮中没有条件分配,只有一个间接费用分配。

      这仅描述了在输出末尾没有“,”的方式。但您可以轻松调整其他条件(反向迭代、跳过特殊值)。

      【讨论】:

      • 将打印数组中他不想做的所有逗号(因为他在打印前检查)
      【解决方案6】:

      如果您不是为学校或任何您在完成方式上受限的事情执行此操作,您可以尝试将项目推送到数组中然后迭代打印出来(使用 for 循环、join 语句或字符串生成器):

        var result = new Array()
        for (x = 0; x < lineChar.length; x++) {
          if (lineChar[x] != ',')
            result.push(lineChar[x]);
        }
        System.out.print(result.join(","));
        System.out.println(); 
      

      或者...甚至更简单:

        var result = lineChar.split(",");
        System.out.print(result.join(",");
        System.out.println(); 
      

      编辑删除了我的第三个选项,因为列出了其他更准确的选项。

      注意:我是一名 c# 和 jscript 程序员,所以对于 java 来说语法可能有点偏离,但我认为 jscript 会很相似。

      【讨论】:

      • OP 的问题有java 标签,这个答案在Java 中不起作用。无论最后的注释如何,您都应该坚持 OP 的要求。
      【解决方案7】:

      你为什么不把 , 完全附加后的最后一个字符子串起来。

      例如

      字符串文本="a,b,c,d,e,f,";

      String finalText = text.substring(0,text.length()-1);

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 2022-10-13
        • 1970-01-01
        相关资源
        最近更新 更多