2014-03-26 145 views
-1

我有一個由字符串組成的ArrayList。此ArrayList包含...使用數字對包含字符串的Arraylist進行排序

「60分鐘」 「120分鐘」 「30分鐘」

如果我使用Collections.sort(ArrayList);它會導致 「120分鐘」 之首。這是因爲在「1」,「120顯然比小‘3’中的‘30’

有沒有一種簡單的方法,使其顯示爲我可以排序此ArrayList ...

」 30分鐘」 ‘60分鐘’ ‘120分鐘’

+1

可能重複 - 是一個內置?](http://stackoverflow.com/questions/1262239/natural-sort-order-string-comparison-in-java-is-one-built-in) – uthark

回答

7

定義自己的類,它實現Comparator<String>,在compare方法,抽取號碼的開出的字符串參數的第一部分,並加以比較,返回-1, 0或1,如果第一個數小於,等於或大於第二個數

然後,您可以將比較器的實例(以及您的ArrayList)傳遞到Collections.sort

+0

我的意思只是一個不同的內置方法(如果有的話)。我正在嘗試爲這一個類增加儘可能少的代碼。但對於其他人來說,這是一個完美的答案。謝謝。 – Zack

+0

此答案*儘可能少代碼。 – aliteralmind

+0

@Zack:然後刪除單詞分鐘並按原始分鐘進行排序,但不顯示文本。然後再恢復文本。似乎很瑣碎 – Brian

1

與Java 8你可以把一個行操作的東西,如:

Collections.sort(list, comparing(s -> Integer.valueOf(s.split("\\s+")[0]))); 

但是仍然需要一些凌亂的邏輯來進行比較。

它可能會更清潔,更容易維護創建一個專門的類,其中包含的信息形式爲int並實現Comparable接口。

+0

什麼是「比較」? – aliteralmind

+1

@aliteralmind http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#comparing-java.util.function.Function- – assylias

0

使用@ rgettman的想法,並假設所有的字符串格式正確,如您的示例輸入,比較本身可能是這樣的:

int spcIdx = s1.indexOf(" "); 
int i1 = s1.substring(0, spcIdx); 
String s1 = s1.substring(spcIdx + 1); 

//Repeat for i1 and s2... 

return (((new Integer(i1)).compareTo(i2) * 10) + s1.compareTo(s2)); 
在Java中[自然排序順序字符串比較
+0

OP剛剛發佈的評論說,60可能成爲如果這種情況發生,那麼這將會失敗。 – Brian

+0

呃。太令人沮喪了。對於在發佈多個答案後發生急劇變化的問題應該有重大的懲罰。 – aliteralmind

+0

@staticx你如何計劃在沒有更多代碼的情況下同時實現「60分鐘」和「60分鐘」的邏輯? – assylias

相關問題