1

私はこのような文字列を持っています:

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

0 番目と 3 番目のインデックスの値を最初に置き換える必要があります。後で、1 番目と 2 番目のインデックスが (既に部分的にフォーマットされた文字列で) 置き換えられ、最終的に使用されます。

私はChoiceFormatを少しいじりましたが、それをMessageFormatクラスでパイプして、目的を達成することができませんでした。

どんなポインタでも大歓迎です!

4

3 に答える 3

2

すべての値を一度に入力するわけではないので、ビルダーを使用することをお勧めします。

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());

このコードにはおそらくエラーチェックなどが欠けており、最適にはほど遠いですが、あなたはその考えを理解しています。

于 2013-01-09T14:56:54.533 に答える
0

これは役に立ちますか?

第2段階で置き換える必要のあるプレースホルダーは、最初に引用されます。

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}
于 2013-01-09T14:57:04.517 に答える
0

特定の文字列が文字列で使用されていないことが確実な場合{somethinig}(そうであるように思われます)、文字列をString.replaceそのままにして、後で使用する値に変更してみませんか?

于 2013-01-09T14:48:37.513 に答える