在Java类

时间:2016-04-15 15:57:47

标签: java comparator

我需要将比较器类添加到我用Java表示卡的类中。一个比较器(compareAscending)将卡按升序排序,首先按套装排序然后排序(即适合订单黑桃,心形,钻石,球杆,然后按值)。第二个比较器(compareRank)按等级的升序排序,即首先是所有三个,然后是所有三个。 。

套装和等级都是枚举,其代码低于

enum Rank {

    TWO(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8),
    NINE(9), TEN(10), JACK(10), QUEEN(10), KING(10), ACE(11);

    private int value;

    Rank(int i) {
        value = i;
    }

    public int getValue() {
        return value;
    }

    public Rank getPrevious() {
        return values()[ordinal() > 0 ? ordinal() - 1 : 0];
    }

}

enum Suit {

    CLUBS, DIAMONDS, HEARTS, SPADES;

    public static Suit randomSuit() {
        Random random = new Random();
        return values()[random.nextInt(values().length)];
    }
}

我之前从未使用过比较器类,所以想知道是否有人可以解释我如何插入它们?它们是否与使该类具有可比性(它是)相同?

提前致谢。

1 个答案:

答案 0 :(得分:4)

Comparator<Card>与实施Comparable<Card>或多或少相同:

a.compareTo(b)

变为

comparator.compare(a, b);

您甚至可以使用为compareTo方法定义的其中一个比较器来避免重复代码:

public class Card implements Comparable<Card> {
    public static final Comparator<Card> COMPARE_ASCENDING = (a, b) -> { /* compare here */ };
    public static final Comparator<Card> COMPARE_DESCENDING = (a, b) -> { /* compare here */ };

    @Override
    public int compareTo(Card other) {
        // Ascending is the "default" sort:
        return COMPARE_ASCENDING.compare(this, other);
    }
}

然后你就可以这样使用:

List<Card> cards = ...;
Collections.sort(cards); // #1
Collections.sort(cards, Card.COMPARE_ASCENDING); // #2, same as #1
Collections.sort(cards, Card.COMPARE_DESCENDING); // #3

您还可以添加其他常用的比较器,例如将Aces视为低卡而不是高卡的比较器。游戏也可以实现自己的游戏特定比较器,但那些不会进入你的Card课程。