簡體   English   中英

對作為數字的字符串的ArrayList進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM