2

(Java 1.5)

我需要分段构建一个字符串。我得到了一组(子)字符串,每个字符串都有它们在最终字符串中所属位置的起点和终点。想知道是否有一些规范的方法可以做到这一点。这不是功课,我可以使用任何可授权的 OSS,例如 jakarta commons-lang StringUtils 等。

我的公司有一个使用 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

如果我正确理解您的要求,您应该可以使用标准来做到这一点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 方法中有两个步骤。

请注意,这未经测试,并且在边缘情况下可能不会做正确的事情,但它应该为您提供一些起点。

于 2010-04-16T12:57:25.020 回答
1

您可以使用StringUtils.rightPad(str, size)添加必要数量的空格。您可以使用以下内容去除不需要的字符:

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