10

例如我想用方法实现类

public class Logger {

    public void info(String message, String[] params) {
    }
}

如果输入是

new Logger().info("Info: param1 is ? , param2 is ?", new  String[] {"a", "b"});

输出必须是

Info: param1 is a , param2 is b

实现它的最简单方法是什么?

4

4 回答 4

23

您可以使用该String.format(String format, Object ... args)方法。除了使用 a 之外?,您还可以使用 C 样式%x格式,其中x可以是d(对于 int)、s(对于字符串)等。

例子

此外,您可以查看Formatter.format类方法。它向您显示所有格式化标志可接受的格式化(String.format()方法用于Formatter进行格式化)。

于 2011-09-02T07:28:24.063 回答
5

以下代码按您的需要执行。

public class Logger {

    public static void main(String[] args) {
        new Logger().info("Info: param1 is ?, param2 is ?", new String[] { "a", "b" });
        new Logger().info("Info: param1 is ?, param2 is ?", "a", "b");
    }

    public void info(final String message, final String... args) {
        System.out.printf(message.replace("?", "%s") + "%n", args);
    }

}

但是,您应该考虑使用正确格式的占位符而不是“?”。例如:

 public class Logger {

    public static void main(String[] args) {
        new Logger().info("Info: param1 is %s, param2 is %s", new String[] { "a", "b" });
        new Logger().info("Info: param1 is %s, param2 is %s", "a", "b");
    }

    public void info(final String message, final String... args) {
        System.out.printf(message + "%n", args);
    }

}

两个版本都将打印:

Info: param1 is a, param2 is b
Info: param1 is a, param2 is b
于 2011-09-02T07:34:10.667 回答
2

如果您不必担心转义'?',并且不能使用 printf() 样式格式字符串,则可以摆脱:

public void info(String message, String[] params) {
    System.out.println(
        String.format(message.replace("?", "%s"), params)
    );
}

像这样:

info("apple is to ? as eve is to ?",
    new String[] { "banana", "noon" });

哪个打印:apple is to banana as eve is to noon


如果您需要更复杂的逻辑,例如转义,那么您可能需要一个成熟Pattern的基于 regexp 的搜索和替换。

于 2011-09-02T07:36:11.200 回答
0

在 params[] 的循环中,使用正则表达式查找每个“?” 在您的字符串中并将其替换为当前参数。当心空值并找到正确的逃生方法?(猜猜\?会带来一些麻烦,更好??)

于 2011-09-02T07:31:50.293 回答