急~~~在线等待. 高手进: JAVA, 关于填充 1MB 零 的问题. 强者送分

kangyanboy 2007-11-27 09:59:25
比如: String text = abcd;
现在要 将text变成长度为1MB的 字符串,在abcd前补零.

我试过用IF语句 :
protected String addZeroLeft(String str, int length)
{
if(str == null) {
str = "";
}
if(str.length()>length){
str = str.substring(0,length);
}
int iSize = length - str.length();

if(iSize <= 0) {
return str;
}
for(int i = 0; i < iSize; i++) {
str = "0" + str;
}
return str;
}

结果效率很低,耗时太长时间才循环完.
而用 java.text.DecimalFormat 却要先给定 1MB的零,也是相当头疼的问题.
问高手有没有类似问题的解决方案. 急~~ 在线等.
...全文
140 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不客气的啦,如果你用的是Eclipse的话,可以在Console上右击,选Preferences...
修改Console buffer size的值就可以了。
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
IDE,
恩 写到文件中就可以看见了.
吃饭咯,太谢谢拉. 学到不少东西.
  • 打赏
  • 举报
回复
太多了,你是在什么地方运行的?是控制台下还是IDE中?
你可以将这个字符串写到文件中就可以看到了。
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
String newStr = addZeroLeft(str, 1024 * 1024);
// 输出最后十位
不是用 System.out.println(newStr.substring(1024*1024 - 10));
而是用 Sysout.println.out(newStr) ;
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
恩,受教了.
还有个问题要问一下,给的定长是 length = 1024*1024
但是用sysout.println.out(newStr) 时,看不见 "0000..." 的输出 ,只看见"abcd".
是不是println的长度受限制了呢? 当长度在 1024*31时候 ,"00.."能打出发行,1024*33 时,就打不出了.
为什么呢?
  • 打赏
  • 举报
回复
char数组是直接在内存中操作数的,是基本类型,实际上StringBuffer的内部也是以char[]实现的,
但是它为什么会慢呢?这主要在于StringBuffer的长度是不定的,在容量不够时需要对数组进行扩容
这样的操作就使效率明显降低了。

这个题目由于事先知道长度的,可以使char数组定长,再者类的方法调用总要比操作基本类型数据来得
慢,所以速度就快很多了,我试了一下,运行速度是StringBuffer的十分之一以下!
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
恩,我看了 .真是快 .
推荐实用.实在是快啊.不过为什么呢? 能不能说明一下 ^_^
  • 打赏
  • 举报
回复
我在3楼的例子就是使用char[]数组的啊
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
啊 ,好象是更快些 哈哈 都是高手
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
还有更好的办法吗? char[] 写法给个例子吧 .我试试 ^_^
  • 打赏
  • 举报
回复
嘿嘿,这个题没有必要去使用StringBuffer,使用StringBuffer也要比使用char数组慢得多!
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
帖子分数少了,对不起啊,是初始值设定的.再次感谢楼上的各位 .^_^ 太谢谢了
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
太谢谢楼上的几位了,谢谢
li_kewei
ProvidenceZY
bao110908
li_kewei
我这就试试看 ^_^
li_kewei 2007-11-27
  • 打赏
  • 举报
回复
import java.math.BigDecimal;

public class TestZero {
private void addZero() {
double start = System.currentTimeMillis();
StringBuffer sb = new StringBuffer("");
for(int i = 0; i< 10000; i++){
sb.append("0");
}
double end = System.currentTimeMillis();
System.out.println("Times:"+(end - start));
}

public static void main(String[] args) {
new TestZero().addZero();
}
}
控制台:
Times:15.0
  • 打赏
  • 举报
回复
public class Test {
public static void main(String[] args) {
String str = "abc";
String newStr = addZeroLeft(str, 1024 * 1024);
// 输出最后十位
System.out.println(newStr.substring(1024*1024 - 10));
}

public static String addZeroLeft(String str, int length) {
if (str.length() >= length) {
return str;
}
char[] c = new char[length - str.length()];
for (int i = 0, k = c.length; i < k; i++) {
c[i] = '0';
}
return new String(c) + str;
}
}
iskyshop 2007-11-27
  • 打赏
  • 举报
回复
string是不可修改的对象,楼主的做法将会产生非常多的对象,当然效率低,改用stringbuffer就不会了
li_kewei 2007-11-27
  • 打赏
  • 举报
回复
不要用String 要用 StringBuffer
kangyanboy 2007-11-27
  • 打赏
  • 举报
回复
"
--------在J2SE版上怎么还有个相同的帖子? "
这个我就不知道了.

火龙果
你有没有MSN,或是其它联系方式呢.
以后向你提问题 ^_^
  • 打赏
  • 举报
回复
在J2SE版上怎么还有个相同的帖子?

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧