2014-04-22 30 views
1

我工作的一個項目,我有一個表在內存中進行排序,例如:最有效的方式來通過多個字段在Java中

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

什麼是寫一個函數,將允許最好的辦法一個用戶指定一些非預定的字段排列排序? (例如,按字段2,字段1,字段5排序)。到目前爲止,我認爲最好的方法是遞歸函數,但它很快就會變得很難看,尤其是在創建和管理每列中的「子組」行時。在我承諾採取這種複雜的方法之前,有人能夠以更高效的方向指出我嗎?

順便說一句,我的表存儲爲數組列表。

回答

2

這裏要實現的關鍵是您的搜索算法始終保持完全相同。唯一改變的是你的實際比較功能。

我會建議使用在ArraysCollections類標準排序,但寫自己的自定義Comparable類或Comparator,其compare方法將使用數據的用戶提供。這實際上是一種有趣的 - 我只寫過使用固定數據的類,但這正是它們的用例。

所有你需要做的是寫函數

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之前的優先級設置。例如

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; 
    } 
} 
+0

據我所知,一個「比較器」將指定如何在特定的排列下對錶格進行排序。這意味着我需要爲每種可能的場景實現一個「比較器」。如果我錯了,請糾正我。我需要更一般的東西,一種能夠採取任何可能的排列組合的方法。 – Mike

+0

@Mike認爲更面向對象。你只需要*寫*自定義代碼一次,但它可能會使用數據,這些數據會在實例化對象和排序時發生變化。 – djechlin

+1

@Mike例如一個'CustomSortable'類,它有'private int columnPriorities [];'作爲一個數據成員,它將被'compare'方法和'setPriorities(int [] newPriorities)'方法使用。所以調用setter之後'compare'方法的行爲就會改變。 – djechlin

相關問題