Discussion:
[問題] parse 數字
(时间太久无法回复)
雪帶不到撒哈拉
2007-07-02 11:01:03 UTC
Permalink
※ 引述《Dancer31 (:p)》之銘言:
: 想把 String的 5,000轉成 5000
: 也就是去掉逗號
: 有函式可以套嗎?
: 感謝~


我也剛學Java不久,有個比較笨但是比較簡單容易看得懂的方法
給你參考看看,我不知道能不能這樣用,但是執行出來是可以...

public class Test5{
public static void main(String[] args){
String test = "123,444,567,31";

String[] tokens = test.split(",");
for(String token : tokens){
System.out.print(token);
}
}
}

純粹用最簡單的 split 來拿掉 , 不知與原題有沒有相符...
如果誤解題意,也請多包涵...

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 221.169.105.172
a***@ptt.cc
2007-07-02 16:32:38 UTC
Permalink
※ 引述《zzzikiri (雪帶不到撒哈拉)》之銘言:
: ※ 引述《Dancer31 (:p)》之銘言:
: : 想把 String的 5,000轉成 5000
: : 也就是去掉逗號
: : 有函式可以套嗎?
: : 感謝~
: 我也剛學Java不久,有個比較笨但是比較簡單容易看得懂的方法
: 給你參考看看,我不知道能不能這樣用,但是執行出來是可以...
: public class Test5{
: public static void main(String[] args){
: String test = "123,444,567,31";
: String[] tokens = test.split(",");
: for(String token : tokens){
: System.out.print(token);
: }
: }
: }
: 純粹用最簡單的 split 來拿掉 , 不知與原題有沒有相符...
: 如果誤解題意,也請多包涵...
哈,你少了一個轉成int的步驟啦~
這樣只是印出來看起來對但還是存在String[]裡阿
並不能變成一個整數來做之後程式需要的運算......

要是我我也是只會立即想到這行最簡單的作法啦 (像PsMonkey版主的想法)

int i = Integer.parseInt("123,456,789".replace(",", ""));

那篇被M的我測過效率還是沒有上面這行快,
但是有時候練習程式也不是光看速度、效率這些東西的...
能不能學到東西和方法也不錯,像那個方法我就完全想不到,
以後再遇到類似問題就多一個思考的方式了,這才是互相討論最珍貴的地方。


不過有時也別太鑽牛角尖,學會語法只是個基礎罷了
像我之前初學時搞不清楚,例如說把int轉成String

String.valueOf(123); 這樣也行
Integer.toString(123); 這樣也行

奇怪結果都能跑出來,還去研究他的performance
後來去trace他的原始碼才發現,其實這兩個根本骨子裡是一樣的東西

後來比較懂OO之後才知道一些Object、一些method為啥要這麼訂...
(不過我到現在JAVA也還是剛學不久啦...可謂新手中的新手 XD)



PS: Eclipse 3.3 europa 正式出了耶,有沒有人裝來玩玩看了?
(我不敢亂update怕有些plug-in會掛掉...)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.31.168.183
勁過呂布
2007-07-03 07:25:22 UTC
Permalink
※ 引述《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)
Loading...