Конечно, можно сделать это без конкатенации, если хотите. Хотя, наверное, не очень стоит.
Это частично зависит от того, где вы собираетесь отображать результат. Если он находится в сети или на консоли, вы можете записать результат непосредственно в выходной поток.
Так, например, если ваш шаблон был что-то вроде "% 001 выпрыгнул из% 002", вы могли бы:
1) просканируйте строку, чтобы найти переменные.
2) разбить строку на список компонентов «the», «выпрыгнул из», в данном случае
3) перебрать элементы вашего списка и результаты и вывести их на вывод примерно так:
PrintStream = //get output from somewhere
for(int i = 0; i < pieces.size()-1 ; i++){
ps.print(peices.get(i));
ps.print(answers.get(i));
}
ps.print(pieces.get(pieces.size()-1));//last one
Теперь. Я не знаю, назовешь ли ты это "элегантно" или нет. Вероятно, это будет довольно быстро. Как я уже сказал, может быть уместно, если это был веб-сервис, который стал очень популярным и т. Д.
Если это приложение с графическим интерфейсом, вы можете написать код для отрисовки строк отдельно, но это, вероятно, займет больше времени, чем конкатенация.
но одна вещь, которую вы могли бы сделать, это использовать ByteArrayOutputStream и предварительно выделить достаточно места, чтобы он мог содержать заполненный madlib без дополнительных выделений. Это было бы довольно быстро.