2

(java 1.5)

文字列をバラバラに組み立てる必要があります。(サブ)文字列のセットが与えられます。各文字列には、最終的な文字列のどこに属するかの開始点と終了点があります。これを行うための標準的な方法があるかどうか疑問に思っていました。これは宿題ではありません。jakartacommons-langStringUtilsなどのライセンス可能なOSSを使用できます。

私の会社にはCharBufferを使用したソリューションがあり、そのままにしておくことに満足しています(そして、いくつかの単体テストを追加しますが、その中にはありません(?!))が、コードはかなり恐ろしいので、もっと読みやすいものが欲しいです。 。

私が言ったように、これは宿題ではなく、完全な解決策は必要ありません。私に洞察を与えるかもしれないライブラリまたはJavaクラスへのポインタだけです。String.Formatはかなり正しくないようでした...

入力が長すぎたり短すぎたりすることを尊重する必要があります。サブストリングは、表示される順序でオーバーレイされます(オーバーラップの場合)。

入力の例として、次のようなものがあります。

文字列:開始:終了

FO:0:3(フィールドより短い文字列)

BAR:4:5(フィールドより大きい文字列)

BLEH:5:9(文字列は前のフィールドをオーバーレイします)

最終的には

FO  BBLEH  
01234567890

(編集:すべての人に-StringBuilder(具体的には、「既知の長さに事前に割り当ててから、.replace()を使用する」テーマ)は私が考えていることのようです。提案してくれたすべての人に感謝します!)

4

4 に答える 4

5
StringBuilder output = new StringBuilder();
// for each input element
{
    while (output.length() < start)
    {
        output.append(' ');
    }
    output.replace(start, end, string);
}

output文字列を挿入する前に、の最終的なサイズを設定することもできます。入力要素を最初に通過して、最大の端を見つけることができます。これがの最終的なサイズになりoutputます。

char[] spaces = new char[size];
Arrays.fill(spaces, ' ');
output.append(spaces);
于 2010-04-16T12:41:59.990 に答える
2

しますStringBuilderか?

StringBuilder sb = new StringBuilder();
sb.setLength(20);
sb.replace(0, 3, "FO");
sb.replace(4, 5, "BAR");
sb.replace(5, 9, "BLEH");
System.out.println("[" + sb.toString().replace('\0', ' ') + "]");
// prints "[FO  BBLEH            ]"
于 2010-04-16T13:03:25.293 に答える
1

を使用StringUtils.rightPad(str, size)して、必要な数のスペースを追加できます。また、以下を使用して、不要な文字を削除できます。

if (str.length() > size) {
   str = str.substring(size);
}
于 2010-04-16T12:29:02.680 に答える
1

私があなたの要件を正しく理解していれば、あなたは標準でこれを行うことができるはずですjava.lang.StringBuilder

public class StringAssembler
{
    private final StringBuilder builder = new StringBuilder();

    public void addPiece(String input, int start, int end)
    {
        final String actualInput = input.substring(0, end-start+1);
        builder.insert(start, actualInput);
    }

    public String getFullString()
    {
        return builder.toString();
    }
}

end特に、パラメータが厳密に必要であるとは思いません。入力文字列の長さを変更するだけで、addPieceメソッドの2つのステップを実行できます。

これはテストされておらず、エッジケースではおそらく正しいことを行わないことに注意してください。ただし、最初から何かを提供する必要があります。

于 2010-04-16T12:57:25.020 に答える