我需要将比较器类添加到我用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)];
}
}
我之前从未使用过比较器类,所以想知道是否有人可以解释我如何插入它们?它们是否与使该类具有可比性(它是)相同?
提前致谢。
答案 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
课程。