我有一个类,Card
:
public class Card implements Comparable<Card> {
public enum rank {TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE};
private rank Rank;
public enum suit {CLUBS, DIAMONDS, HEARTS, SPADES};
private suit Suit;
}
,我需要执行两个任务。首先 - 制作卡片类可比,这样的compareTo可以用来卡的升序排列。我在这里所做的是:
@Override
public int compareTo(Card other) {
if(this.Rank != other.Rank) {
if(this.Rank.ordinal() > other.Rank.ordinal()) {
return 1;
}
else if(this.Rank.ordinal() < other.Rank.ordinal()) {
return -1;
}
else {
return 0;
}
}
else {
if(this.Suit.ordinal() > other.Suit.ordinal()) {
return 1;
}
else if(this.Suit.ordinal() < other.Suit.ordinal()) {
return -1;
}
else {
return 0;
}
}
}
其次 - 添加一个比较类的嵌套类称为CompareDescending卡类的。这应该是用于对卡片进行排序降序排列。我在这里做到了这一点,它工作得很好:
public static class CompareDescending implements Comparator<Card> {
@Override
public int compare(Card card, Card other) {
if(card.Rank != other.Rank) {
if(card.Rank.ordinal() < other.Rank.ordinal()) {
return 1;
}
else if(card.Rank.ordinal() > other.Rank.ordinal()) {
return -1;
}
else {
return 0;
}
}
else {
if(card.Suit.ordinal() < other.Suit.ordinal()) {
return 1;
}
else if(card.Suit.ordinal() > other.Suit.ordinal()) {
return -1;
}
else {
return 0;
}
}
}
}
不过,我想,如果我已经走了关于这个错误的方式。如果我的嵌套类比较使用的compareTo()函数里面呢?这是更好的做法?
你compareTo
是过于复杂。
enum
实现compareTo
为你,为按序号在声明的顺序排序枚举值,即。
这意味着你的代码可以简单地:
@Override
public int compareTo(Card other) {
int cmp = this.Rank.compareTo(other.Rank);
if (cmp == 0)
cmp = this.Suit.compareTo(other.Suit);
return cmp;
}
要以相反的顺序进行比较,你只需翻转被比较的对象,即代替a.compareTo(b)
你写b.compareTo(a)
,所以下降的Comparator
实现将是:
public static class CompareDescending implements Comparator<Card> {
@Override
public int compare(Card card, Card other) {
return other.compareTo(card); // descending
}
}
这是记录(评论)的比较是相反的,因为代码的休闲评审会很容易错过一个好主意。在这里,我简单地评论说,比较的是“降”记录它。
您自定义的比较是非常复杂的。 Comparator
类提供合适的方法,使定制的比较器更容易。此外,enum
实现了自然秩序比较。
要创建降序排列比较,你不必重写存在升序比较。就在打电话Comparator.reverseOrder()
。
class Card implements Comparable<Card> {
public static final Comparator<Card> SORT_ASC = Comparator.<Card, Rank>comparing(card -> card.rank).thenComparing(card -> card.suit);
public static final Comparator<Card> SORT_DESC = SORT_ASC.reversed();
private Rank rank;
private Suit suit;
@Override
public int compareTo(Card card) {
return SORT_ASC.compare(this, card);
}
public enum Rank {}
public enum Suit {}
}
演示
List<Card> cards = Collections.emptyList();
List<Card> asc = cards.stream().sorted(Card.SORT_ASC).collect(Collectors.toList());
List<Card> desc = cards.stream().sorted(Card.SORT_DESC).collect(Collectors.toList());