我有一个很大的原始类型数组(double)。如何按降序排列元素?
不幸的是,Java API不支持使用比较器对原始类型进行排序。
可能想到的第一种方法是将其转换为对象列表(装箱):
double[] array = new double[1048576];
Arrays.stream(array).boxed().sorted(Collections.reverseOrder())…
但是,对数组中的每个原语进行装箱速度太慢,并且会导致很大的GC压力!
另一种方法是排序然后反转:
double[] array = new double[1048576];
...
Arrays.sort(array);
// reverse the array
for (int i = 0; i < array.length / 2; i++) {
// swap the elements
double temp = array[i];
array[i] = array[array.length - (i + 1)];
array[array.length - (i + 1)] = temp;
}
这种方法也很慢 -特别是在数组已经很好排序的情况下。
有什么更好的选择?
Java Primitive包含用于基于自定义比较器对基本数组进行排序的功能。使用它和Java 8,你的示例可以编写为:
double[] array = new double[1048576];
...
Primitive.sort(array, (d1, d2) -> Double.compare(d2, d1), false);
如果你使用的是Maven,则可以将其包含在:
<dependency>
<groupId>net.mintern</groupId>
<artifactId>primitive</artifactId>
<version>1.2.1</version>
</dependency>
当你将false
第三个参数传递给时sort
,它将使用不稳定的排序,这是Java内置的double-pivot quicksort
的简单编辑。这意味着速度应接近内置分拣的速度。
问题内容: 以下代码将按 升序 对数组进行排序: 我需要 按降序 排序。如何使用比较器执行此操作? 请帮忙。 问题答案: 对于原始数组类型,您必须编写一个反向排序算法: 或者,您可以将转换为并编写比较器: 或使用,因为它仅适用于非原始数组类型。 最后,
问题内容: 我想创建一个通用函数来根据传递的属性对类数组进行排序。 例如,我有这些课程 这些数组 如何为数组编写通用扩展名,以便根据传递的属性对其进行排序?(例如,persons.sort(名称)或cars.sort(制造商)) 谢谢! 问题答案: 干得好: 用法: 这是一个不变的版本: 正如Leo Dabus指出的那样,您可以将扩展名概括为以下内容:
我试图建立一个方法,将排序一个二维数组的双打按列。基于所提供的规范,此方法也不应该采用长度不等的行的粗糙数组。我正在使用双[][]mdarray={{3.0, 4.0, 1.0, 8.0},{13.0, 2.0, 12.0, 9.0}测试这个 使用打印方法时,应将其显示为 3.0, 2.0, 1.0, 8.0, 13.0, 4.0, 12.0, 9.0, 使用单独的打印方法输出结果时,数组似乎没有
我想按第三个和第一个元素对元组数组进行排序,因此我使用了以下代码: 我的问题是,在前面的例子中,我可以按第三个元素和第一个元素的升序排序,也可以按它们的降序排序(使用反向)。但是如何按第三个元素的升序和第一个元素的降序排序。 请在你的回答中考虑以下情况: 在这种情况下,我不知道内部数组的确切大小(取决于我读入该数组的文件模式),我想按侧中的所有项进行排序(一些升序和一些降序)。 编辑:看起来,我明
问题内容: 令我惊讶的是,以前没有提出过这个具体问题,但我的确没有在SO或文档中找到它。 假设我有一个包含整数的随机numpy数组,例如: 如果对它进行排序,则默认情况下我将获得升序: 但我希望解决方案按 降序 排序。 现在,我知道我可以永远做: 但这最后的陈述 有效 吗?它不是按升序创建副本,然后反转此副本以反转顺序获得结果吗?如果确实如此,是否有有效的选择?看起来好像不接受参数来更改排序操作中
有人能提供帮助,如何检查排序降序数组以及?干杯!