如何实现比较使用的compareTo()

问题描述 投票:1回答:2

我有一个类,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()函数里面呢?这是更好的做法?

java
2个回答
5
投票

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
    }
}

这是记录(评论)的比较是相反的,因为代码的休闲评审会很容易错过一个好主意。在这里,我简单地评论说,比较的是“降”记录它。


0
投票

您自定义的比较是非常复杂的。 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());

相关问题