Способ форматирования строк с помощью?? параметры для полной строки в java?

Например, я хочу реализовать класс с методом

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

Каков самый простой способ его реализации?

Ответ 1

Вы можете использовать метод String.format(String format, Object ... args). Вместо ? вы можете использовать формат C style %x, где x может быть d (для int), s (для строки) и т.д.

Example.

Также вы можете просмотреть метод класса Formatter.format. Он показывает все флаги форматирования acceptale для форматирования (String.format() метод использует Formatter для форматирования).

Ответ 2

Следующий код выполняет по мере необходимости.

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

Ответ 3

Если вам не нужно беспокоиться об экранировании '?', и вы не можете использовать строки стиля стиля 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 и замена.

Ответ 4

в цикле на params [] используйте regexp, чтобы найти все '?' в вашей строке и замените ее текущим параметром. Остерегайтесь нулей и находите правильный способ побега? (угадайте, что-нибудь вызовет, лучше?)