在Java中按多个字段排序的最有效方法

时间:2014-04-22 23:58:37

标签: java list sorting recursion

我正在开发一个项目,我在内存中有一个表,例如:

field1    field2    field3    field4    field5
somevalue somevalue somevalue somevalue somevalue
somevalue somevalue somevalue somevalue somevalue
    .
    . 
    .
    .
    v

编写一个允许用户指定某些字段的非预定排列的函数的最佳方法是什么? (例如,按field2排序,然后按field1,然后按field5)。到目前为止,我想到的最好的方法是递归函数,但它很快就会变得很难看,尤其是在每列中创建和管理行的“子组”时。在我采取这种错综复杂的方法之前,有人能指出我更有效的方向吗?

顺便说一句,我的表存储为数组列表。

1 个答案:

答案 0 :(得分:2)

这里要认识到的关键是你的搜索算法始终保持完全相同。唯一改变的是你的实际比较功能。

我建议您在ArraysCollections课程中使用标准排序,但要编写自己的自定义Comparable课程或Comparator,其compare方法将使用用户提供的数据。这实际上很有趣 - 我只编写了使用固定数据的Comparable类,但这只是它们的用例。

您需要做的就是编写函数

public int compare(Row row1, Row row2) {
    // iterate over the columns *in order of the user-supplied priority*
    // return appropriately
}

Here's documentation on the Comparable class

And Comparator

您需要哪一个取决于您实施的内容,我忘记了细节,但应该是直截了当的。

这里的关键#2是你可以在设置优先级之前实例化你的ColumnPrioritiesComparable。 e.g。

class ColPriComp implements Comparable<ColPriComp> {
    private volatile int[] priorities; // possibly static, or obtained some other way,
    // so there's only one shared among all classes

    @Override
    public int compareTo(ColPriComp other) {
        // use "priorities" to do the comparison
    }

    public void setPriorities(int[] newPriorities) {
        this.priorities = newPriorities;
    }
}