2011-10-15 41 views
3

我们有方法,看起来像这样:的Java格式阵列(使用格式化类)

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中可能吗?

+0

我不明白这一点。你不能只是连接一切吗? (如果你有一个模式,只需在模式中运行每个字符串并连接结果) – NullUserException

+0

是的,对于引用的特定示例,调用'StringUtils.join(args,'')'是要走的路,但我认为OP就是以此为例。 :) –

+0

我知道第三方类操作对象(如'StringUtils'),但通常先转到java。*'包,如果可以的话。 –

回答

3

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

格式说明符可以通过三种方式引用参数:在格式说明中包含的参数指标

明确的索引使用。参数索引是一个十进制整数,指示参数列表中参数的位置。第一个参数是由“1 $”引用的,第二个参数是“2 $”等。一个参数可能被多次引用。例如:

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

相对索引用于当格式说明含有这引起争论一个 '<'( '\ u003c')标志先前的格式说明符将被重新使用。如果没有先前的参数,则抛出MissingFormatArgumentException。

formatter.format(“%S%S%‘ABBB’ //‘c’和‘d’被忽略,因为它们没有被引用

普通索引用于当格式说明既不包含一个参数索引也不是'<'标志,每个使用普通索引的格式说明符都被分配一个连续的隐式索引到参数列表中,该索引与显式索引或相对索引所使用的索引无关。

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

有可能有一个使用所有形式的索引,例如一个格式字符串:

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

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

如果有更多的参数比格式说明符,额外的参数被忽略。

你所要求的是一种构建模式的方法,它将接受任意数量的参数并使用tham all。问题是Formatter类只能显式地,相对地或正常地将格式说明符与参数相关联。在每种情况下,形式说明符的数量是固定的。没有构造可以在其中重复或循环格式说明符。相关的技术看起来很有前途,但是没有办法嵌套或循环它。

+0

我一直希望有一些漂亮的无证技巧,但看起来像这样行不通。那么我会做出适当的使用其他方法。 –

-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(" + ")) : "-"; 
}