2015-02-23 55 views
2

我想使用Lambda表達式進行排序,但問題是我無法按正常順序排序(例如1,2,3, 4)。我需要以另一種順序排序(例如2,1,3,4)。 有沒有辦法使用Lambda表達式來做到這一點?
這裏是我想轉換爲Lambda表達式的代碼(如果可能):
發現我可以用Lambda表達式比較/排序固定,非自然順序的有限值

private static Comparator<Card> bySuit = new Comparator<Card>() { 
    public int compare(Card c1, Card c2) { 
     int this_suit = c1.getSuit().value(); 
     int other_suit = c2.getSuit().value(); 

     if((this_suit == 2 && other_suit == 1) || (this_suit == 1 && other_suit == 2)){ 
      return other_suit - this_suit; 
     } 
     return this_suit - other_suit; 
    } 
}; 

編輯:

private static Comparator<Card> bySuit = (c1, c2) -> { 
     int this_suit = c1.getSuit().value(); 
     int other_suit = c2.getSuit().value(); 

     if((this_suit == 2 && other_suit == 1) || (this_suit == 1 && other_suit == 2)){ 
      return other_suit - this_suit; 
     } 
     return this_suit - other_suit; 
}; 

但有一個更好的辦法?

+0

那麼,除了前兩個元素,還是隻有具有某些特定值的元素,你想要有自然順序?例如,應該是結果還是排序'3,4,5,6'? – Pshemo 2015-02-23 03:53:18

+0

@pshemo只有一些具有特定值的元素。 – Mark 2015-02-23 03:57:50

回答

2

這與lambda表達式無關:如果您想要按固定順序進行排序/比較的項數有限,則可以將該順序寫入數組,然後比較數組中的值:

int[] myOrder = {2, 1, 3, 4}; 
Comparator<Card> bySuit = (c1, c2) -> Integer.compare(
    myOrder[c1.getSuit().value() - 1], myOrder[c2.getSuit().value() - 1]); 

如果要排序的值不是一個(幾乎)完整的範圍內,可以使用Map<Key, Integer>