对作为数字的字符串的ArrayList进行排序

时间:2014-10-13 11:52:41

标签: java arrays sorting arraylist

对包含数字的ArrayList<String>(以降序/升序方式)排序的最快方法是什么,例如:{ "12", "3.5", "188", "33.03" }Collections是否有内置方法?目前我正在将ArrayList的内容复制到ArrayList<Double>,然后使用Collections.Sort()方法,然后将其放回到初始数组。有更快的方法吗?

6 个答案:

答案 0 :(得分:9)

如果您使用的是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 - 函数,但之后使用函数快速测试每次调用时增加一个计数器,该函数的调用与使用旧式&#34;对&#34; -comparator一样频繁。还是,有点短......

答案 1 :(得分:6)

您需要实现自己的比较器,并在列表中使用它。 您必须使用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());

答案 2 :(得分:4)

请尝试以下代码:

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

答案 3 :(得分:4)

我认为您当前的方法可能很好,我会避免使用自定义Comparator,因为您最终会将相同的字符串多次转换为数值(每次排序算法要比较2个值)而不是像现在一样。

答案 4 :(得分:1)

您可以在Collections.sort()上使用List<String>,字符串为Comparable,但该比较不会为您提供正确的结果。

您也可以定义自己的Comparator,并将其传递给Collections.sort()

答案 5 :(得分:1)

您可以尝试使用sortedset接口,它可以在输入数据时为您提供已排序的数据。更好地实现您自己的比较器,我相信这将是无益的。