作者superlubu (劲过吕布)
看板java
标题Re: [问题] parse 数字
时间Tue Jul 3 15:24:26 2007
※ 引述《archerlin ()》之铭言:
: 哈,你少了一个转成int的步骤啦~
: 这样只是印出来看起来对但还是存在String[]里阿
: 并不能变成一个整数来做之後程式需要的运算......
: 要是我我也是只会立即想到这行最简单的作法啦 (像PsMonkey版主的想法)
: int i = Integer.parseInt("123,456,789".replace(",", ""));
: 那篇被M的我测过效率还是没有上面这行快,
: 但是有时候练习程式也不是光看速度、效率这些东西的...
其实如果论速度,每次只 parse 一次 DecimalFormat 的确是比不上 replaceAll
再 Integer.parseInt 的。
(注意: 是用 replaceAll, 因 replace 是 replace character only...
我使用 JDK1.5 中)
不过当会重覆使用很多次的话,用一个 static 的 DecimalFormat Object 会比重
覆的 call replaceAll 来得快。
而如果假设输入的 string 只能是正数,且不理会 , 的出现格式,还是使用化石级
的 primitive 处理法最快... 以下补上吃饱没事做的程式码 XD
public static void main(String argv[]) throws Exception {
int noftime = 100000;
String strTMP = "13,424,555";
String pattern = "#,###;(#,###)";
Number parsedNum = null; int num = 0;
long t = System.currentTimeMillis();
java.text.DecimalFormat dfmt = new java.text.DecimalFormat(pattern);
for (int i=0; i<noftime; i++)
parsedNum = dfmt.parse(strTMP);
System.out.println("D. Format: " + (System.currentTimeMillis() - t)
+ "ms");
t = System.currentTimeMillis();
for (int i=0; i<noftime; i++)
num = Integer.parseInt(strTMP.replaceAll(",",""));
System.out.println("parseInt: " + (System.currentTimeMillis() - t)
+ "ms");
int result = 0;
t = System.currentTimeMillis();
for (int i=0; i<noftime; i++) {
result = 0;
for (int j=0; j<strTMP.length(); j++) {
char c = strTMP.charAt(j);
if (c == ',') continue;
if ( c < '0' || c > '9' )
throw new IllegalArgumentException("Unexpected character: "
+ c);
result *= 10;
result += (int) c - '0';
}
}
System.out.println("Primitive" + (System.currentTimeMillis() - t)
+ "ms");
}
得出结果是:
D.Format: 297ms
parseInt: 640ms
Primitive: 16ms
还是 primitive 王道 XD
不过值得商榷,有多少个程式需要这样十万次呢?我不断将 noftime 调低,看看到
了多少次,才会令 D.Format 和 parseInt 平手
(好啦,我们就别理 Primitive 这蛮牛了 XD)
一下子将 noftime 降到 25000:
D.Format: 156ms
parseInt: 219ms
Primitive: 0ms
看到两方都已经非常地接近了 (啊不是说好不提 Primitive 吗)
继续实验的结果是,当 noftime 介乎 1500 - 2000 的时候,两者的耗用时间就差不
多了,而当 noftime 比 1000 为低时,parseInt 就肯定会比 D.Format 有效率...
如果没有 Primitive 比来搅局的话 XDrz
不过仍然强调,在实验中只有 new 过一次 DecimalFormat。如果程式不容许有一个共
用的 DecimalFormat instance,那就没话说了 :D
--
很多人以为 所以我要 其实我是个快
我是
大学生 告诉大家 三十岁的
怪叔叔
● ●/ ︿ ︿
/
劲\ <
劲 ●
ㄨ /\ ㄨ
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.218.142.161
※ 编辑: superlubu 来自: 203.218.142.161 (07/03 15:25)