【问题标题】:Inserting Comparator classes in a Java class在 Java 类中插入比较器类
【发布时间】:2016-04-16 00:09:38
【问题描述】:

我需要将比较器类添加到我用 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)];
    }
}

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

提前致谢。

【问题讨论】:

  • 您可以使用这些比较方法创建一个 Card 类。只需使用.ordinal() 来获取枚举在枚举数组中的位置并像这样比较它们。
  • 您要求提供教程。为什么具体不能自己写代码?
  • 您不需要“插入”它们,只需创建两个Comparator 实现,并将该比较器的一个实例传递给排序函数以供其使用。
  • 您正在使用 java 8,对吗?因为 java 8 Comparator 可以做的事情相当紧凑,并且可以组合事物。在卡片类型中包含 Suite 和 Rank 是有意义的。对于不同的游戏,不同的比较器可能有意义。

标签: java comparator


【解决方案1】:

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

您还可以添加其他常见的比较器,例如将 A 视为低牌而不是高牌的比较器。游戏也可以实现自己的游戏特定比较器,但这些比较器不会出现在您的 Card 类中。

【讨论】:

    猜你喜欢
    • 2014-03-08
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2015-10-11
    • 2021-09-06
    • 2016-07-21
    相关资源
    最近更新 更多