对包含数字的ArrayList<String>
(以降序/升序方式)排序的最快方法是什么,例如:{ "12", "3.5", "188", "33.03" }
? Collections
是否有内置方法?目前我正在将ArrayList
的内容复制到ArrayList<Double>
,然后使用Collections.Sort()
方法,然后将其放回到初始数组。有更快的方法吗?
答案 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接口,它可以在输入数据时为您提供已排序的数据。更好地实现您自己的比较器,我相信这将是无益的。