2017-02-08 50 views
1

我需要的是以自定義的方式排列列表,我正在研究正確的方法,並找到番石榴的排序API,但事情是,我訂購的列表並不總是相同的,我只需要2場是在列表的頂部,例如我有這樣的:使用部分顯式和其他順序排序?

List<AccountType> accountTypes = new ArrayList<>(); 
AccountType accountType = new AccountType(); 
accountType.type = "tfsa"; 
AccountType accountType2 = new AccountType(); 
accountType2.type = "rrsp"; 
AccountType accountType3 = new AccountType(); 
accountType3.type = "personal"; 
accountTypes.add(accountType3); 
accountTypes.add(accountType2); 
accountTypes.add(accountType); 
//The order I might have is : ["personal", "rrsp", "tfsa"] 
//The order I need is first "rrsp" then "tfsa" then anything else 

我試圖用一個自定義的比較,並使用排序,番石榴庫中,這樣的事情:

public static class SupportedAccountsComparator implements Comparator<AccountType> { 
    Ordering<String> ordering = Ordering.explicit(ImmutableList.of("rrsp", "tfsa")); 
    @Override 
    public int compare(AccountType o1, AccountType o2) { 
     return ordering.compare(o1.type, o2.type); 
    } 
} 

但它會拋出一個異常,因爲顯式排序不支持不在你提供的列表中的其他項目,有沒有辦法做一個部分顯式的o訂貨信?像這樣:

Ordering.explicit(ImmutableList.of("rrsp", "tfsa")).anythingElseWhatever(); 
+0

如果你剛在'AccountType'屬性('order' /'priority'),這將是'1'和'2'這兩個帳戶類型和'0'每一個其他類型的?然後你會定義主要基於該屬性的順序。 –

+0

[Guava:如何從列表和單個元素創建明確的排序?]可能的副本(http://stackoverflow.com/questions/14403114/guava-how-to-create-an-explicit-ordering-from -a-list-and-a-single-element) –

回答

1

你不需要番石榴爲此,你需要的一切都在收集API。

假設AccountType實現Comparable,你可以提供一個Comparator,用於返回"tfsa""rrsp"最低值,但保留分揀到AccountType的默認比較器的其餘部分:

Comparator<AccountType> comparator = (o1, o2) -> { 
    if(Objects.equals(o1.type, "rrsp")) return -1; 
    else if(Objects.equals(o2.type, "rrsp")) return 1; 
    else if(Objects.equals(o1.type, "tfsa")) return -1; 
    else if(Objects.equals(o2.type, "tfsa")) return 1; 
    else return o1.compareTo(o2); 
}; 
accountTypes.sort(comparator); 

如果你不這樣做希望您的其他物品排序,只是提供總是返回0的默認比較。

+0

將嘗試這一個,我有一個比較器,但這不是那麼幹淨 – Eefret

+0

哦,我需要rrsp,然後tfsa,但得到tfsa然後rrsp,我想改變的價值將做 – Eefret

+0

是的,我誤解了你的問題。請參閱編輯。 – MikaelF

1

這是一個Comparator解決方案,它使用字符串的List表示yo你的排序順序。只需更改sortOrder列表中字符串的順序即可更改排序順序。

Comparator<AccountType> accountTypeComparator = (at1, at2) -> { 
    List<String> sortOrder = Arrays.asList(
     "rrsp", 
     "tfsa", 
     "third" 
     ); 
    int i1 = sortOrder.contains(at1.type) ? sortOrder.indexOf(at1.type) : sortOrder.size(); 
    int i2 = sortOrder.contains(at2.type) ? sortOrder.indexOf(at2.type) : sortOrder.size(); 
    return i1 - i2; 
    }; 
    accountTypes.sort(accountTypeComparator);