作者ClareQ (人比人Cheese人)
看板java
标题Re: [J2SE] String padding 的问题
时间Tue Apr 29 03:11:24 2008
※ 引述《godfat (godfat 真常)》之铭言:
: : 推 ClareQ:还可以更快喔,照理说不用每次都产生一组char阵列^^ 04/27 02
: 试了一下,这样确实更快:
: 1 是我原本的写法
: 2 是原 po 的写法
: 3 是 infinitlee 的 String.format(为什麽那麽慢?我以为会很快)
: 4 是改成暴力写死的写法
哈 我的意思不是要暴力把char[]写死,
而是尝试从需求面的角度开发这个class。
通常用到String Padding功能,是为了建立纯文字的表格,
特性是每个栏位的长度会一直套用到下一列,
不会不断产生随机的padding长度。
在这样的需求下,
在建构子时就决定要多长,用什麽字元填充,
应该可以获得最好的使用经验。
且若在每个栏位重复使用产生出的object,
可以获得最好的效率。
pad方法传出char[]是因为在这样的需求下,
往往会用StringBuffer或是BufferedWriter来承接处理过的内容,
多加上一层String壳反而浪费。
public class StringPadder {
private char[] buf;
private int len;
public StringPadder(int size) {
this(size, ' ');
}
public StringPadder(int size, char ch) {
buf = new char[len = size];
while (--size >= 0) buf[size] = ch;
}
public char[] padRight(String str) { // for text
char[] tmp = new char[len];
int size = str.length();
if (size >= len) size = len;
else System.arraycopy(buf, 0, tmp, size, len - size);
str.getChars(0, size, tmp, 0);
return tmp;
}
public char[] padLeft(String str) { //for number
char[] tmp = new char[len];
int size = str.length(), offset = len - size;
if (offset <= 0) str.getChars(-offset, size, tmp, 0);
else {
System.arraycopy(buf, 0, tmp, 0, offset);
str.getChars(0, size, tmp, offset);
}
return tmp;
}
}
使用范例:
public static void main(String[] args) {
int[] columnSize = new int[] {300, 400, 500, 600, 700};
int n = columnSize.length, testCount = 100000;
char padChar = '.';
String data = "1234567890123456789012345678901234567890";
long t = System.currentTimeMillis();
//每个column建立一个StringPadder
StringPadder[] columns = new StringPadder[n];
for (int i = 0; i < n; i++) columns[i] =
new StringPadder(columnSize[i], padChar);
//产生每列的资料
for (int i = 0; i < testCount; i++)
for (int j = 0; j < n; j++) columns[j].padRight(data);
System.out.println(System.currentTimeMillis() - t);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.169.100.236