繁体   English   中英

Java格式数组(使用Formatter类)

[英]Java format array (using the Formatter class)

我们有这样的方法:

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中是否可行?

如果我理解正确,您要求的功能不存在。 这是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”)// - >“dcbadcba”

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

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

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

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

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

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

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

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

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

用这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM