2013-11-02 4 views
0

Можно ли создать в java что-то вроде этого someFunction("%s, %s, %s", 1, true, "qwe");, где результат должен быть 1 true qwe?Строка формата с неопределенным количеством аргументов

Я пробовал его с различными подходами, такими как использование PrintStream и некоторых других классов, но я не могу понять, как это сделать.

До сих пор один вещи, которые кажутся наверняка является определение:

public static String prepare(String format, Object... arguments) { 
    return ??? 
} 

Но я не могу понять, как сделать это прошлое. Можете ли вы дать мне несколько советов?

ответ

2

Вот что String.format() предназначен для

String.format("%s, %s, %s", 1, true, "666"); 

В вашем случае,

return String.format(format, arguments); 
+0

Теперь я чувствую себя глупо ... Я не знаю, почему я не понял, что в классе String есть такая штука ... – NewProger

+0

@NewProger - Случается для всех. Без вопросов!:) – SudoRahul

3

Да, это именно то, что String.format() делает:

public class Test { 

    public static void main(String[] args) { 
    System.out.println(format("%s %s %s", 12, "A", true)); 
    } 

    public static String format(String format, Object ... args) { 
    return String.format(format, args); 
    } 

} 
4

Вы можете использовать String.format метод:

public static String prepare(String format, Object... arguments) { 
    // do same sanity checks if needed 
    return String.format(format, arguments); 
} 
4

Это то, что делает String.format, но я предполагаю, что вы уже это знаете и хотели бы создать свою собственную функцию.

Заголовок функции, который у вас есть, является правильным. Теперь вам нужно сделать счетчик count изначально установленным на ноль, создать StringBuilder и запустить цикл, который сканирует строку format.

Когда ваша петля встречает символ, отличный от '%', добавьте этот символ к StringBuilder. В противном случае проверьте следующий символ для формата, который распознает ваша программа, и возьмите объект в позиции count из массива arguments. Отформатируйте объект по мере необходимости и добавьте результат в StringBuilder; приращение count.

Как только цикл закончен, StringBuilder содержит строку результатов, которую вы возвращаете вызывающим абонентам.

Конечно, это всего лишь скелет алгоритма. Настоящая реализация должна заботиться о многих других важных вещах, таких, как

  • Проверка, что count в петле не продвигается мимо конца arguments массива
  • Проверка, что окончательного count не менее число объектов в arguments
  • Проверка, что спецификатор формата может быть применен к объекту из массива arguments

и так далее.

+0

Спасибо за подробное объяснение, это, безусловно, очень полезно. Но, оказывается, я могу использовать стандартный String.Format(), завернутый в мою собственную функцию. – NewProger