Явский MessageFormat - замените стоимость в индексе

У меня есть Последовательность как это:

{0}/suhdp run -command "suhilb" -input /sufiles/{1} -output /seismicdata/mr_files/{2}/ -cwproot {3}

Для ценностей в 0th и 3-м индексе нужно к замененному сначала. Позже, 1-е и 2-е индексы будут замененный (на уже частично отформатированной строке) и наконец используемый.

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

Любые указатели приветствуются!

1
nl ja de
Так как ваши аргументы, чтобы MessageFormat отложены, вы могли рассмотреть использование строителя
добавлено автор fge, источник
См. мой ответ, он может дать вам некоторые намеки на то, как сделать это
добавлено автор fge, источник
Это собирается справиться с файлами с местами на имя?
добавлено автор artbristol, источник
@artbristol Да, у файла может быть пространство
добавлено автор Kaliyug Antagonist, источник
Я немного изменил ваш вопрос попытаться облегчить понимать (который получит вас больше ответов). Пожалуйста, удостоверьтесь everything' s все еще, поскольку вы предназначили
добавлено автор Miquel, источник

3 ответы

Так как вы не заполняете все ценности сразу, я предложил бы, чтобы вы использовали строителя:

public class MessageBuilder
{
    private final String fmt;
    private final Object[] args;

    public MessageBuilder(final String fmt, final int nrArgs)
    {
        this.fmt = fmt;
        args = new Object[nrArgs];
    }

    public MessageBuilder addArgument(final Object arg, final int index)
    {
        if (index < 0 || index >= args.length)
            throw new IllegalArgumentException("illegal index " + index);
        args[index] = arg;
        return this;
    }

    public String build()
    {
        return MessageFormat.format(fmt, args);
    }
}

Таким образом, можно сделать:

final MessageBuilder msgBuilder = new MessageBuilder("{0}/suhdp run -command \"suhilb\" -input /sufiles/{1} -output /seismicdata/mr_files/{2}/ -cwproot {3}", 4)
    .addArgument(arg0, 0).addArgument(arg3, 3);

// later on:
msgBuilder.addArgument(arg1, 1).addArgument(arg2, 2);
// print result
System.out.println(msgBuilder.build());

Этот код, вероятно, испытывает недостаток в некоторой проверке на ошибки и т.д., и это далеко от того, чтобы быть оптимальным, но вы получаете идею.

2
добавлено
Честно, я don' t знают, я don' t действительно используют MessageFormat . Ваш лучший выбор состоит в том, чтобы, вероятно, попытаться экспериментировать, что происходит, если вы вводите неправильный номер аргументов... Чтобы найти заполнителей, я предполагаю, что простой regex может помочь вам сделать это.
добавлено автор fge, источник
Спасибо! Это служило моей цели!!! Только ради создания универсального кода, как может нет. из индексов, которые будут заменены в Последовательности (в моем случае, 4), может быть найден так, чтобы MessageBuilder мог использоваться последовательностями с различным нет. из индексов, которые будут заменены?
добавлено автор Kaliyug Antagonist, источник

Если вы уверены, что конкретная последовательность {somethinig} не используется в вашей последовательности (поскольку это, кажется, имеет место), почему не только держат последовательность, как, и использовать String.replace чтобы изменить его на любые ценности, вы имеете позже?

0
добавлено

Это может помочь?

Заполнители, которые должны быть заменены на второй стадии, указаны первоначально.

public static void main(String[] args) {
    final String partialResult = MessageFormat.format("{0} '{0}' '{1}' {1}", "zero", "three");
    System.out.println(partialResult);
    final String finalResult = MessageFormat.format(partialResult, "one", "two");
    System.out.println(finalResult);
}

Тогда ваша строка формата становится:

{0}/suhdp run -command "suhilb" -input /sufiles/'{0}' -output /seismicdata/mr_files/'{1}'/ -cwproot {1}
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async