【问题标题】:printing elements in a nice format以漂亮的格式打印元素
【发布时间】:2011-03-21 12:43:23
【问题描述】:

关于一个困扰我的真正小问题,我有一个简单的一般性问题: 我正在即时打印元素列表,因此我对打印元素的数量没有先验知识。我想要一个简单的格式,其中元素用逗号(elem1,elem2...)或类似的东西分隔。现在,如果我使用一个简单的循环,例如:

while(elements to check) {
  if (elem should be printed) {
     print elem . ","
  }
}

我在最后一个元素后面加了一个逗号... 我知道这听起来很愚蠢,但是有没有办法解决这个问题?

【问题讨论】:

  • 您使用什么语言?什么平台?
  • perl, java - 我在这两个中都有同样的问题

标签: java perl list printing


【解决方案1】:

让我们假设“应该打印”的意思是“至少一个非空白字符。在 Perl 中,写这个的惯用方式是(您需要调整 grep 以适应口味):

print join "," => grep { /\S/ } @elements;

“grep”类似于其他语言中的“过滤器”,而 /S/ 是匹配一个非空白字符的正则表达式。仅返回与表达式匹配的元素。 “加入”应该是不言自明的。

perldoc -f join
perldoc -f grep

【讨论】:

  • 是不是不需要做 grep 的事情,比如 -- print join ',', @elements -- 把整个事情都做的很完美?我只是问,以提高我自己的知识
  • benzebuth:grep 只是用来过滤掉不需要的元素。但是,在原始海报提到的情况下,它可能会被丢弃,这是正确的。我打字太快了。谢谢:)
【解决方案2】:

将所有数据放在一个数组中然后

打印加入(',',@yourarray)

是个好东西。

你也可以,在你的连接循环之后

声明 eltToPrint 而(elt上的循环){ eltToPrint .= elt.',' }

用正则表达式删除最后一个逗号:

eltToPrint =~s/,$//;

ps:如果你把逗号放在开头也可以使用

eltToPrint =~s/^,//;

【讨论】:

    【解决方案3】:

    Java 没有内置join,但如果你不想重新发明轮子,可以使用Guava's Joiner。可以skipNulls,或者useForNull(something)

    使用分隔符连接文本片段(指定为数组、Iterable、可变参数甚至Map)的对象。它将结果附加到Appendable 或将它们作为String 返回。示例:

    Joiner joiner = Joiner.on("; ").skipNulls();
    return joiner.join("Harry", null, "Ron", "Hermione");
    

    这将返回字符串"Harry; Ron; Hermione"。请注意,所有输入元素在附加之前都使用Object.toString() 转换为字符串。

    【讨论】:

      【解决方案4】:

      为什么不在每个元素(但第一个元素)之前添加一个逗号?伪代码:

      is_first = true
      loop element over element_array
      BEGIN LOOP
         if (! is_first)
             print ","
         end if
         print element
         is_first = false
      END
      print NEWLINE
      

      【讨论】:

      • 不要忘记将“is_first”变量设置为 false。否则,你永远不会打印那个逗号:)
      【解决方案5】:

      我想最简单的方法是创建一个新数组,其中只包含您需要打印的原始数组中的元素(即filter 操作)。然后打印新创建的数组,最好使用您语言的内置数组/向量打印/连接函数。

      (在 Perl 中)

      @orig=("a","bc","d","ef","g");
      @new_list=();
      for $x(@orig){
          push(@new_list,$x) if (length($x)==1);
      }
      print join(',',@new_list)."\n";
      

      (在 Java 中)

      List<String> orig=Arrays.asList(new String[]{"a","bc","d","ef","g"});
      List<String> new_list=new ArrayList<String>();
      for(String x: orig){
          if (x.length()==1)
              new_list.add(x);
      }
      System.out.println(new_list);
      

      【讨论】:

      • Perl 示例不必要地复杂,而且不是严格安全的。更好更容易:使用严格;使用警告;使用 5.010;我的@orig=("a","bc","d","ef","g");说 join(', ', grep { 长度 > 1 } @orig); - 迈克尔
      【解决方案6】:

      您有多种选择,具体取决于语言。

      例如在 JavaScript 中只做:

      var prettyString = someArray.join(', ');
      

      在 PHP 中你可以implode()

      $someArray = array('apple', 'orange', 'pear');
      $prettyString = implode(",", $someArray);
      

      如果所有其他方法都失败了,您可以在每个条目后添加逗号并在完成后修剪最后一个,或者如果这不是最后一项(如果是这样,添加逗号)

      更新: 既然您提到了 Java...您可以创建这样的方法:

      public static String join(String[] strings, String separator) {
        StringBuffer sb = new StringBuffer();
        for (int i=0; i < strings.length; i++) {
          if (i != 0) sb.append(separator);
            sb.append(strings[i]);
        }
        return sb.toString();
      }
      

      更新 2: 听起来你真的想要这个,那么如果你没有输出每个元素(伪代码):

      first = true;
      for(item in list){
        if(item meets condition){
          if(!first){
            print ", ";
          } else {
            first = false;
          }
          print item;
        }
      }
      

      【讨论】:

      • 抱歉,我一定是遗漏了一些东西……你必须从什么数据开始?例如几个字符串,一个字符串数组?,一个字符串的ArrayList?还是带有键/值的 Map 或类似对象?
      • 这并不重要,关键是我没有打印整个数组/列表;我检查每个元素与某些条件,然后决定是否打印它。所以在打印一个元素时,我无法判断它是否是最后一个要打印的元素。
      猜你喜欢
      • 2011-05-06
      • 2014-03-31
      • 1970-01-01
      • 2011-01-07
      • 2020-01-24
      • 2018-10-04
      • 2022-01-22
      • 1970-01-01
      • 2013-01-20
      相关资源
      最近更新 更多