[英]Sort an ArrayList of Strings that are numbers
對包含數字的ArrayList<String>
(以遞減/遞增方式)進行排序的最快方法是什么,例如: { "12", "3.5", "188", "33.03" }
? Collections
是否有內置的方法? 目前我正在將ArrayList
的內容復制到ArrayList<Double>
,然后使用Collections.Sort()
方法,然后將其放回到初始數組。 有更快的方法嗎?
如果您使用的是Java 8,則可以使用Comparator.comparing(Double::parseDouble)
使用parseDouble
快速創建比較器。 這應該(見下文)為每個條目調用一次函數,而不是每對一次。
List<String> list = Arrays.asList( "12", "3.5", "188", "33.03" );
list.sort(Comparator.comparing(Double::parseDouble));
System.out.println(list);
輸出:
[3.5, 12, 33.03, 188]
更新:嗯,我認為這會為每個元素調用比較器函數一次,比如在Python中使用key
-function,但是在每次調用時使用函數增加計數器的快速測試后,函數被調用為通常使用舊式“配對”比較器。 還是,有點短......
您需要實現自己的比較器,並在列表中使用它。 您必須使用BigDecimal,因為您可能會遇到精度損失的問題。 你可以使用double,如果你的數字要求小精度。
class MyComparator implements Comparator<String, String> {
public int compare(String o1, String o2){
return new BigDecimal(o1).compareTo(new BigDecimal(o2));
}
}
...
Collections.sort(list, new MyComparator());
請嘗試以下代碼:
String test[] = {"12", "3.5", "188", "33.03"};
double numbers[] = new double[test.length];
for (int i = 0; i < test.length; i++) {
numbers[i] = Double.parseDouble(test[i]);
}
Arrays.sort(numbers);
for (double i : numbers) {
System.out.println(i);
}
輸出:
3.5
12.0
33.03
188.0
我認為您當前的方法可能很好,我會避免使用自定義Comparator
因為您最終會將相同的字符串多次轉換為數值(每次排序算法要比較2個值)而不是像您一樣現在。
您可以在List<String>
上使用Collections.sort()
,String是Comparable
,但該比較不會為您提供正確的結果。
您也可以定義自己的Comparator
,並將其傳遞給Collections.sort()
。
您可以嘗試使用sortedset接口,它可以在輸入數據時為您提供排序數據。更好地實現您自己的比較器,我相信這對我來說沒什么用處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.