(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()”主题)似乎是我在想的。感谢所有建议的人! )
答案 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方法。
请注意,这没有经过测试,并且在边缘情况下可能没有做正确的事情,但它应该为您提供一些开始。