【问题标题】:How to concatenate variable arguments of string如何连接字符串的可变参数
【发布时间】:2014-12-18 11:16:08
【问题描述】:

我需要将可变数量的参数(字符串类型)连接到一个字符串:

例如:

System.out.println( add("ja", "va") );

应该返回java,但我的实现返回jaja

我试过了:

public static String add(String... strings) {
    for (String arg : strings) {
        return String.format(arg.concat(arg));
    }
    return "string";
}

我做错了什么?

【问题讨论】:

  • 你确定要返回这个return "string";

标签: java string arguments return variadic-functions


【解决方案1】:

现在您可能想要使用:

String.join(separator, strings)

【讨论】:

    【解决方案2】:

    您将在循环的第一次迭代 (return String.format ...) 中返回,而不是在结束时返回。你应该在这里使用StringBuilder:

    public static String add(String... strings) {
        StringBuilder builder = new StringBuilder();
        for (String arg : strings) {
            builder.append(arg);
        }
        return builder.toString();  //Outputs the entire contents of the StringBuilder.
    }
    

    【讨论】:

      【解决方案3】:

      将 Java 8 的 StringJoiner 与流 API 结合使用:

      String joined = Stream.of(strings).collect(Collectors.joining());
      

      包装在一个方法中,它可能看起来像这样:

      import java.util.stream.Collectors;
      import java.util.stream.Stream;
      
      public static String join(String separator, String... strings) {
          return Stream.of(strings).collect(Collectors.joining(separator));
      }
      

      【讨论】:

        【解决方案4】:

        试试这个:

        String result;
        for (int i =0, i < strings.size(), i++){
         result += strings[i];
        }
        return result;
        

        【讨论】:

        • 它可以工作,但是对于大量的字符串,它会非常低效。
        • 是的,StringBuilder 更好,我只是想展示其他连接字符串的方法。
        【解决方案5】:

        有很多方法,但 StringBuilder 可能是最有效的:

        public static String add(String... strings) {
            StringBuilder sb = new StringBuilder();
            for (String arg : strings) {
                sb.append(arg);
            }
            return sb.toString();
        }
        

        基本上,您将构建器初始化为空,然后遍历附加每个参数的参数,最后返回构建器的内容。

        您可能希望在循环中添加一些代码来处理参数中的空值(数组不会为空,但其中的字符串可能是。按原样,此方法会将字符串“null”附加为空值,这可能不是你想要的。

        【讨论】:

          【解决方案6】:

          您可以使用新的 Java 8 lambda 和类似的东西,

          String[] arr = { "ja", "va" };
          Optional<String> result = Arrays.asList(arr).parallelStream()
                  .reduce(new BinaryOperator<String>() {
                      public String apply(String t, String u) {
                          return t + u;
                      }
                  });
          System.out.println(result.get());
          

          【讨论】:

            【解决方案7】:

            要回答你的问题,这行是你做错了什么:

            return String.format(arg.concat(arg));

            for each 循环中的第一次 arg 将是字符串 ja。您使用相同的 var arg(即 ja)连接该字符串并连接。然后你返回,所以你永远不会进入第二次循环。

            要解决此问题,请按照其他人的建议进行,并使用一些东西来收集和加入每个变量。

            要为您提供另一种加入解决方案,您可以尝试仅加入 varargs 变量。所以你可以试试:

            return String.join('',strings);

            这样,无需编写循环,只需加入字符串即可。这假设 Java 9。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-15
              • 1970-01-01
              • 2017-05-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多