用Java實現撲克牌排序

簡單發表於2012-11-30

思路:給花色賦權重0 13 26 39,排序時某個卡牌的絕對值等於花色+數字,依據這個排序,一次掃描OK。

程式碼

public class PokerSorter {
// inner class
static class Card {
    public int color;
    public int number;
    @Override
    public String toString(){
        String colorString = "";
        String numberString = "";
        switch(color){
            case 0 : colorString = "♠"; break;
            case 13 : colorString = "♥"; break;
            case 26 : colorString = "♣"; break;
            case 39  : colorString = "♦"; break;
        }
        switch(number){
            case 11 : numberString = "J"; break;
            case 12 : numberString = "Q"; break;
            case 13 : numberString = "K"; break;
            case 14 : numberString = "A"; break;
            default : numberString = String.valueOf(number);break;
        }
        return colorString + numberString;
    }
}

public static void main(String[] args) {    
    // cards init
    List<Card> cards = new ArrayList<Card>(52);
    for (int i = 0; i < 52; i++) {
        Card card = new Card();
        card.number = i % 13 + 2;
        card.color = i / 13 * 13;
        cards.add(card);
    }

    // cards shuffle
    Collections.shuffle(cards);

    // print before sort
    System.out.println("排序前:");
    Iterator<Card> cardsIter = cards.iterator();
    while(cardsIter.hasNext()){
        System.out.print(cardsIter.next());
    }

    // cards sort
    /*
    Collections.sort(cards,new Comparator<Card>(){
        @Override
        public int compare(Card card1, Card card2) {
            int weight1 = card1.color + card1.number;
            int weight2 = card2.color + card2.number;
            return weight1 - weight2;
        }

    });
    */
    //自己寫快排
    quickSort(cards, 0, cards.size()-1);
    // print after sort
    System.out.println("");
    System.out.println("排序後:");
    cardsIter = cards.iterator();
    while(cardsIter.hasNext()){
        System.out.print(cardsIter.next());
    }

}

}

輸出enter image description here

後續:2gua提示不能用語言庫, 將Collection.sort改為自定義quickSort方法,輸出不變。

// partition
public static int partition(List<Card> list, int low, int high) {
    // 先以第一個記錄為軸
    int tmpColor = list.get(low).color;
    int tmpNumber = list.get(low).number;        
    // 軸的權重
    int weight = list.get(low).color + list.get(low).number;
    while (low < high) {  
        while (low < high && list.get(high).color + list.get(high).number > weight) {  
            high--;  
        }  
        // 比軸小的移到低端
        list.get(low).color = list.get(high).color;
        list.get(low).number = list.get(high).number;
        while (low < high && list.get(low).color + list.get(low).number < weight) {  
            low++;  
        }  
        // 比軸大的移到高階
        list.get(high).color = list.get(low).color;
        list.get(high).number = list.get(low).number;
    }  
    // 軸記錄到位
    list.get(low).color = tmpColor;
    list.get(low).number = tmpNumber;
    // 返回軸位置
    return low; 
} 

// quick sort
public static void quickSort(List<Card> list, int low, int high) {  
    if (low < high) {  
        int middle = partition(list, low, high);
        quickSort(list, low, middle - 1);
        quickSort(list, middle + 1, high);
    }  
}

相關文章