给定特定的起点和终点位置构建String的好方法是什么?

时间:2010-04-16 12:21:52

标签: java string stringbuffer

(java 1.5)

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

我的公司有一个使用CharBuffer的解决方案,我很满意保留原样(并添加一些单元测试,其中没有(?!))但代码相当可怕,我想要一些东西更容易阅读。

正如我所说,这不是功课,我不需要一个完整的解决方案,只需要一些指向库或java类的指针,这可能会给我一些见解。 String.Format看起来并不正确......

我必须尊重输入太长和太短等。子字符串将按它们出现的顺序重叠(如果重叠)。

作为输入的一个例子,我可能会有:

字符串:开始:结束

FO:0:3(字符串比字段短)

BAR:4:5(字符串大于字段)

BLEH:5:9(字符串覆盖前一个字段)

我想以

结束
FO  BBLEH  
01234567890

(编辑:对所有人 - StringBuilder(具体而言,“预分配到已知长度,然后使用.replace()”主题)似乎是我在想的。感谢所有建议的人! )

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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            ]"

答案 2 :(得分:1)

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

if (str.length() > size) {
   str = str.substring(size);
}

答案 3 :(得分: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方法。

请注意,这没有经过测试,并且在边缘情况下可能没有做正确的事情,但它应该为您提供一些开始。