【发布时间】:2011-02-13 11:02:13
【问题描述】:
我需要使用自定义比较器和交换功能来排序功能。我可以自己写一个,但我想知道其他人是否还没有这样做。 Java 运行时包含许多专门的排序函数,用于对原始类型、对象等的数组进行排序,但它们都没有将交换函数作为参数。谷歌搜索也没有找到任何有用的东西。
public interface IntComparator
{
int compare(int a, int b);
}
public interface IntSwap
{
void swap(int a, int b);
}
public static void sort(IntComparator compFn, IntSwap swapFn, int off, int len);
【问题讨论】:
-
自定义交换函数除了交换元素还能做什么?
-
一个自定义的swap函数可以用来统计需要swap的次数,这对你学习编程很有好处。不过,Java 标准库并不是为这些事情而设计的。
-
我需要交换两个数组中的索引。我知道我可以对二维数组进行排序,但这会增加所需的内存。每个 java 对象都有相当大的开销(大约 40 个字节),我试图避免它。
-
除非万不得已,否则不要担心内存使用情况。对于像这样的问题,有额外的内存开销来标记每个对象的初始位置应该没问题。但是,如果您要对如此庞大的数组进行排序,以至于它们几乎无法放入内存中,那么这是一个需要考虑的合理问题。
-
减少使用的内存量是我想要做的事情的重点。我正在优化较大框架的一部分,该框架将数据从数据库加载到内存,对其进行排序并将其发送到 Jasper Reports。当前数据存储在行中,每行都有值数组。每行可能有几个子报表。子报表由行数组组成……等等。我想将所有数据存储到一个(或多个)大字节数组和几个整数数组中,这些数组包含行/子报表数据开始的数据的索引。这将减少大约 100 倍的内存,还可以减少 CPU 负载(数据可能适合 L2/L3 缓存)