這裏要實現的關鍵是您的搜索算法始終保持完全相同。唯一改變的是你的實際比較功能。
我會建議使用在Arrays
或Collections
類標準排序,但寫自己的自定義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;
}
}
據我所知,一個「比較器」將指定如何在特定的排列下對錶格進行排序。這意味着我需要爲每種可能的場景實現一個「比較器」。如果我錯了,請糾正我。我需要更一般的東西,一種能夠採取任何可能的排列組合的方法。 – Mike
@Mike認爲更面向對象。你只需要*寫*自定義代碼一次,但它可能會使用數據,這些數據會在實例化對象和排序時發生變化。 – djechlin
@Mike例如一個'CustomSortable'類,它有'private int columnPriorities [];'作爲一個數據成員,它將被'compare'方法和'setPriorities(int [] newPriorities)'方法使用。所以調用setter之後'compare'方法的行爲就會改變。 – djechlin