Java格式数组(使用Formatter类)

时间:2011-10-15 03:33:16

标签: java string format

我们有这样的方法:

public String getCommandString(Object...args) {
    return this.code + " " + String.format(this.pattern, args);
}

this.code:intthis.pattern:String的位置。

这种方法通常称为:

// cmd.code = 20
// cmd.pattern = "%1$s = %2$d"
String str = cmd.getCommandString("foo", 3);   // -> "20 foo = 3"

和其他字符串模式(这是一个非常简单的基于文本的服务器 - 客户端程序)

现在,模式是否可以考虑可变数量的参数,例如

// cmd.code = 20
// cmd.pattern = ???
String s1 = cmd.getCommandString("a", "b", "c");               // -> 20 a b c
String s2 = cmd.getCommandString("Hello", "world");            // -> 20 Hello world
String s3 = cmd.getCommandString("1", "2, "3", "4", "5", "6"); // -> 20 1 2 3 4 5 6

假设每个参数可能属于同一类型(字符串)?或者我是否必须覆盖方法并手动格式化字符串?更具体地说,我正在寻找一个通用的字符串模式来格式化可变数量的参数(相同类型)。我记得在C中做过这样的事情,但这在Java中可能吗?

2 个答案:

答案 0 :(得分:3)

如果我理解正确,您要求的功能不存在。以下是Formatter类的javadoc部分:

  

格式说明符可以通过三种方式引用参数:

     

当格​​式说明符包含参数索引时,使用显式索引。参数index是一个十进制整数,表示参数列表中参数的位置。第一个参数由“1 $”引用,第二个参数由“2 $”引用,等等。参数可以多次引用。例如:

     

formatter.format(“%4 $ s%3 $ s%2 $ s%1 $ s%4 $ s%3 $ s%2 $ s%1 $ s”,                       “A B C D”)      // - > “d c b a d c b a”

     

当格​​式说明符包含'<'时使用相对索引('\ u003c')标志,它导致重用前一格式说明符的参数。如果没有先前的参数,则抛出MissingFormatArgumentException。

     

formatter.format(“%s%s%”a b b b“       //“c”和“d”被忽略,因为它们未被引用

     

当格​​式说明符既不包含参数索引也不包含'<'时,使用普通索引。旗。使用普通索引的每个格式说明符都被赋予一个顺序隐式索引到参数列表中,该索引独立于显式或相对索引使用的索引。

     

formatter.format(“%s%s%s%s”,“a”,“b”,“c”,“d”)      // - > “a b c d”

     

可以使用格式字符串,该字符串使用所有形式的索引,例如:

     

formatter.format(“%2 $ s%s%”b a a b“      //“c”和“d”被忽略,因为它们未被引用

     

最大参数数量受Java虚拟机规范定义的Java数组的最大维数限制。如果参数索引与可用参数不对应,则抛出MissingFormatArgumentException。

     

如果参数多于格式说明符,则忽略额外参数。

您要求的是一种构建模式的方法,该模式将接受任意数量的参数并使用全部。问题是Formatter类只能明确地,相对地或通常地将格式说明符与参数相关联。在每种情况下,格式说明符的数量是固定的。没有可以重复或循环格式说明符的构造。相对技术看起来很有希望,但没有办法嵌套或循环它。

答案 1 :(得分:-1)

使用此

public String getCommandString(Object...args) {
    // Want to have a "-" if args are not given
    return this.code + " " + args != null && args.length > 0
            ? Arrays.stream(args).map(o -> o.toString()).collect(Collectors.joining(" + ")) : "-";
}