动态格式化字符串

时间:2010-03-23 06:54:51

标签: java

在我徘徊并自己动手之前,我想知道是否有人知道如何做以下事情......

目前我正在使用MessageFormat创建一些字符串。我现在要求其中一些字符串具有可变数量的参数。

例如(当前代码):

MessageFormat.format("{0} OR {1}", array[0], array[1]);

现在我需要这样的东西:

// s will have "1 OR 2 OR 3"
String s = format(new int[] { 1, 2, 3 }); 

// s will have "1 OR 2 OR 3 OR 4"
String s = format(new int[] { 1, 2, 3, 4 }); 

有几种方法我可以考虑创建格式字符串,例如每个参数的数量为1个字符串(它们的数量有限,所以这很实用,但看起来很糟糕),或者动态构建字符串(它们很多,所以这可能很慢)。

还有其他建议吗?

4 个答案:

答案 0 :(得分:5)

除非,我遗漏了一些陈旧的join。在Java 7获得String.join(没有玩笑)之前,有一些实现,比如Apache commons lang StringUtils.join

StringUtils.join(new Integer[] { 1, 2, 3, 4 }, "OR");

唯一的问题是它不能直接用于原始的int []数组。

答案 1 :(得分:1)

使用Dollar应该很简单:

String s1 = $(1, 3).join(" OR ");
String s2 = $(1, 4).join(" OR ");

其中$(1, n)是范围对象包装器(有Collection s,数组,CharSequence等的包装器。

答案 2 :(得分:1)

您可以使用 Java 8 及以后的 String#join 方法,这将允许您使用给定的分隔符连接字符串。

String.join(" OR ", "a", "b", "c") 

答案 3 :(得分:0)

我认为最简单的解决方案是编写一个快速函数,该函数遍历for循环中的参数,将“ OR ” + arg[i]附加到StringBuilder(第一个参数的特殊情况),然后返回StringBuilder的toString()值。怎么回事?

String format(String... args) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < args.length; i++) {
        if (i > 0) {
            sb.append(" OR ");
        }
        sb.append(args[i]);
    }
    return sb.toString();
}