Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对数字字符串的ArrayList进行排序_Java_Arrays_Sorting_Arraylist - Fatal编程技术网

Java 对数字字符串的ArrayList进行排序

Java 对数字字符串的ArrayList进行排序,java,arrays,sorting,arraylist,Java,Arrays,Sorting,Arraylist,对包含数字的数组列表(降序/升序)排序的最快方法是什么,例如:{“12”、“3.5”、“188”、“33.03”}?Collections是否有用于此的内置方法?目前,我正在将ArrayList的内容复制到ArrayList,然后使用Collections.Sort()方法,然后将其放回初始数组。有没有更快的方法?您可以使用列表上的集合.sort(),字符串是可比的,但这种比较不会给出正确的结果 您还可以定义自己的比较器,并将其传递给集合。sort()尝试以下代码: String test[]

对包含数字的
数组列表
(降序/升序)排序的最快方法是什么,例如:
{“12”、“3.5”、“188”、“33.03”}
Collections
是否有用于此的内置方法?目前,我正在将
ArrayList
的内容复制到
ArrayList
,然后使用
Collections.Sort()
方法,然后将其放回初始数组。有没有更快的方法?

您可以使用
列表上的
集合.sort()
,字符串是
可比的
,但这种比较不会给出正确的结果

您还可以定义自己的
比较器
,并将其传递给
集合。sort()

尝试以下代码:

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);
}

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

您需要实现自己的比较器,并在你的清单上使用它。 您必须使用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());
类MyComparator实现比较器{
公共整数比较(字符串o1、字符串o2){
返回新的BigDecimal(o1)。与(新的BigDecimal(o2))进行比较;
}
}
...
Collections.sort(list,new MyComparator());

如果您使用的是Java 8,则可以使用
Comparator.Comparating(Double::parseDouble)
使用
parseDouble
快速创建比较器。这应该(见下文)为每个条目调用函数一次,而不是为每对调用函数一次

List<String> list = Arrays.asList( "12", "3.5", "188", "33.03" );
list.sort(Comparator.comparing(Double::parseDouble));
System.out.println(list);

更新:嗯,我认为这会对每个元素只调用一次comparator函数,就像在Python中使用
-函数一样,但是在使用一个函数进行快速测试后,每次调用该函数时都会增加一个计数器,调用该函数的频率与使用老式“pair”比较器的频率相同。不过,稍微短一点…

您可以尝试sortedset接口,该接口使您能够在输入数据期间对已排序的数据进行操作。最好实现您自己的比较器,我相信这不会有什么好处。

您可以实现您自己的比较器,不确定是否更快。为什么要将数字作为字符串插入arraylist@GeorgeThomas长话短说:维护别人的代码。@GeorgeThomas我同意,如果是我,我会让他们都加倍检查这个答案[这里][1]。它适用于所有类型的变量。[1] :的确,为什么?我现在正在尝试这就是作者做这件事的方式,我没有否决我所做的,是的,但可能有一种更快的方式。你可以使用comparator,但我认为这是更快的方式。是的,为什么要投反对票?我个人不会在这里使用
Float
s,因为可能会失去准确性(当然取决于输入值),但原则上这应该没问题。当原始元素为“0.1”时,OPs方法是否有风险在列表中以“0.099999999123”结尾?关于多次转换的观点是正确的;一种解决方案可能是将转换后的值保存到地图,然后进行检查。但是,哪种解决方案更快是一个完全不同的问题…谢谢。虽然要编写的代码较少,但我使用Java 7,据我所知,List在版本7中没有sort()方法,对吗?有什么解决办法吗?你必须找到解决方案,就像旧的Java版本一样。您可以创建一个比较器,如上面的示例中所示,或者必须使所有集合对象实现可比较,然后使用Collections.sort():)所以不,List没有排序方法:)为什么?因为它是一个iterface,有时列表不需要编制索引。@Ben在Java 8中,是最好的Java 1.7解决方案!除非您知道这些值的精度有限,否则可以使用
Double.parseDouble()
代替
BigDecimal
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]