【问题标题】:Java - Append quotes to strings in an array and join strings in an arrayJava - 将引号附加到数组中的字符串并连接数组中的字符串
【发布时间】:2013-08-16 04:21:32
【问题描述】:

我想将双引号附加到数组中的字符串,然后将它们作为单个字符串加入(保留引号)。是否有任何字符串库可以做到这一点?我已经尝试了 Apache commons StringUtils.join 和 Google guava 中的 Joiner 类,但找不到任何附加双引号的内容。

我的输入将是一个数组,如下所述:

String [] listOfStrings = {"day", "campaign", "imps", "conversions"};

所需的输出应如下所述:

String output = "\"day\", \"campaign\", \"imps\", \"conversions\"";

我知道我可以遍历数组并附加引号。但如果有的话,我想要一个更清洁的解决方案。

【问题讨论】:

    标签: java guava apache-commons


    【解决方案1】:

    使用 Java 8+

    Java 8 具有 Collectors.joining() 及其重载。它还有String.join

    使用StreamCollector

    幼稚但有效的方法

    String wrapWithQuotesAndJoin(List<String> strings) {
      return strings.stream()
        .map(s -> "\"" + s + "\"")
        .collect(Collectors.joining(", "));
    }
    

    最短且性能可能更好(不过有点骇人听闻)

    String wrapWithQuotesAndJoin(List<String> strings) {
      return strings.stream()
        .collect(Collectors.joining("\", \"", "\"", "\""));
    }
    

    使用String.join

    非常老套。不要使用。 (但必须提到)

    String wrapWithQuotesAndJoin(List<String> strings) {
      return strings.isEmpty() ? "" : "\"" + String.join("\", \"", strings) + "\""
    }
    

    使用旧版本的 Java

    帮自己一个忙,使用图书馆。 Guava 立即浮现在脑海中。

    使用番石榴

    private static final Function<String,String> addQuotes = new Function<String,String>() {
      @Override public String apply(String s) {
        return new StringBuilder(s.length()+2).append('"').append(s).append('"').toString();
      }
    };
    String wrapWithQuotesAndJoin(List<String> strings) {     
        return Joiner.on(", ").join(Iterables.transform(listOfStrings, addQuotes));
    }
    

    没有库

    String wrapWithQuotesAndJoin(List<String> strings) {
      if (listOfStrings.isEmpty()) {
        return "";
      }
      StringBuilder sb = new StringBuilder();
      Iterator<String> it = listOfStrings.iterator();
      sb.append('"').append(it.next()).append('"'); // Not empty
      while (it.hasNext()) {
        sb.append(", \"").append(it.next()).append('"');
      }
      result = sb.toString();
    }
    

    注意事项

    • 所有解决方案都假定stringsList&lt;String&gt; 而不是String[]。您可以使用Arrays.asList(strings)String[] 转换为List&lt;String&gt;。您可以使用Arrays.stream(strings) 直接从String[] 获取Stream&lt;String&gt;
    • Java 8+ sn-ps 使用+ 连接,因为此时+ 通常比StringBuilder 性能更好。
    • 旧版本的 sn-ps 使用 StringBuilder 而不是 +,因为它通常在旧版本上更快。

    【讨论】:

      【解决方案2】:
      String output = "\"" + StringUtils.join(listOfStrings , "\",\"") + "\"";
      

      【讨论】:

      • 参数颠倒:StringUtils.join("\",\"", listOfStrings)
      • 如果 listOfStrings 为空,则打印两个引号 (""),这在某些情况下是不可接受的。
      【解决方案3】:

      将引号与分隔符一起添加,然后将引号附加到前后。

      "\"" + Joiner.on("\",\"").join(values) + "\""
      

      【讨论】:

        【解决方案4】:

        您也可以自己为此功能创建代码:

        String output = "";
        
        for (int i = 0; i < listOfStrings.length; i++)
        {
            listOfStrings[i] = "\"" + listOfStrings[i] + "\"";
            output += listOfStrings[i] + ", ";
        }
        

        【讨论】:

          【解决方案5】:
          public static void main(String[] args) {
              // TODO code application logic here
              String [] listOfStrings = {"day", "campaign", "imps", "conversions"};
              String output = "";
          
              for (int i = 0; i < listOfStrings.length; i++) {
                  output += "\"" + listOfStrings[i] + "\"";
                  if (i != listOfStrings.length - 1) {
                      output += ", ";
                  }
              }
          
              System.out.println(output);
          }
          

          输出:“day”、“campaign”、“imps”、“conversions”

          【讨论】:

          • Sommes - StringUtils.join 是一个更简洁的解决方案。我想知道是否有任何库也具有附加双引号的功能。
          【解决方案6】:

          JDK 中没有可以做到这一点的方法,但是您可以使用 Apache Commons Langs StringUtls 类,StringUtils.join() 它会起作用

          【讨论】:

          • Himanshu - 我已经在使用 StringUtils.join。我想知道我们如何将双引号附加到字符串。我很抱歉没有说清楚。我将编辑我的帖子。
          【解决方案7】:

          一个更通用的方式是 sth。喜欢:

          private static class QuoteFunction<F> {
              char quote;
          
              public QuoteFunction(char quote) {
                  super();
                  this.quote = quote;
              }
          
              Function<F, String> func = new Function<F,String>() {
                  @Override
                  public String apply(F s) {
                      return new StringBuilder(s.toString().length()+2).append(quote).append(s).append(quote).toString();
                  }
              };
          
              public Function<F, String> getFunction() {
                  return func;
              }
          }
          

          ...通过以下函数调用它

          public static <F> String asString(Iterable<F> lst, String delimiter, Character quote) {
              QuoteFunction<F> quoteFunc = new QuoteFunction<F>(quote);
              Joiner joiner = Joiner.on(delimiter).skipNulls();
              return joiner.join(Iterables.transform(lst, quoteFunc.getFunction()));
          }
          

          【讨论】:

            猜你喜欢
            • 2016-03-02
            • 1970-01-01
            • 2023-01-19
            • 2018-07-24
            • 1970-01-01
            • 2016-02-01
            • 2019-05-02
            • 2015-01-22
            • 1970-01-01
            相关资源
            最近更新 更多