java - 如何使用比较器方法对枚举对象进行排序?

标签 java

我有一张类(class)卡和一个类(class)手。 我还有 2 个枚举:
包含数值的花色:DIAMOND、CLUB、HEART、SPADE
和包含以下值的排名:二、三、四、五、六、七、八、九、十、 jack 、皇后、国王、王牌

Hand 类有一个链接到 Card 类的数组列表。我想重写 Hand 类中的compareto() 方法,以便卡片对象按排名值按以下顺序排序:

二、三、四、五、六、七、八、九、十、 jack 、皇后、国王、王牌按升序排列。

如果有 2 张牌具有相同的等级值,则应按花色值对它们进行排序:

钻石、梅花、红心、黑桃按升序排列。

例如,如果一只手牌包含以下牌:黑桃二、方 block 二、红心王牌、梅花九。然后假设当我在包含卡片的数组列表上调用 Collections.sort() 时,它们应该按以下顺序打印:钻石二,黑桃二,俱乐部九,红桃王牌。

compareto() 方法中的代码目前不起作用。

public class Card implements Comparable<Object> {
private Suit suit;
private Rank rank;

public Card(Suit suit, Rank rank) {
    this.suit = suit;
    this.rank = rank;
}

public Suit getSuit() {
    return suit;
}

public void setSuit(Suit suit) {
    this.suit = suit;
}

public Rank getRank() {
    return rank;
}

public void setRank(Rank rank) {
    this.rank = rank;
}

@Override
public String toString() {
    return getSuit() + " " + getRank();
}

@Override
public int compareTo(Object otherObject) {
    Card other = (Card) otherObject;
    if (rank.TWO < other.rank.THREE) {
        return -1;
    }
    if (rank.TWO > other.rank.THREE) {
        return 1;
    }
    return 0;
}

}




public class Hand {
private ArrayList<Card> cards = new ArrayList<>();

public boolean add(Card c) {
    if (linearSearchList(cards, c) == false) { // if the card do NOT exist in the arraylist
        cards.add(c);
        return true;
    }
    return false;
}

public boolean remove(Card c) {
    if (linearSearchList(cards, c) == true) { // if the card already in the arraylist
        cards.remove(c);
        return true;
    }
    return false;
}

public ArrayList<Card> getCards() {
    return new ArrayList<>(cards);
}

public static boolean linearSearchList(ArrayList<Card> cardsList, Card c) {
    boolean found = false;
    int i = 0;
    while (!found && i < cardsList.size()) {
        if (cardsList.get(i).equals(c)) {
            found = true;
        } else {
            i++;
        }
    }
    if (found) {
        return true;
    } else {
        return false;
    }
}

@Override
public String toString() {
    Collections.sort(cards);

    return cards.toString();
}

}



public enum Suit {
DIAMOND, CLUB, HEART, SPADE;
}


public enum Rank {
TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE;

}



public class MainApp {

public static void main(String[] args) {
    Card c1 = new Card(Suit.DIAMOND, Rank.QUEEN);
    Card c2 = new Card(Suit.HEART, Rank.EIGHT);
    Card c3 = new Card(Suit.DIAMOND, Rank.KING);
    Card c4 = new Card(Suit.CLUB, Rank.TWO);
    Card c5 = new Card(Suit.SPADE, Rank.ACE);

    Hand hand1 = new Hand();
    hand1.add(c1);
    hand1.add(c2);
    hand1.add(c3);
    hand1.add(c4);
    hand1.add(c5);
    Collections.sort(hand1.getCards());

    for (Card card : hand1.getCards()) {
        System.out.println(card);
    }

}

}

最佳答案

首先,让你的类实现 Comparable<Card> ,使用Object当您尝试与随机对象进行比较时可能会引入错误:

public class Card implements Comparable<Card> {

您甚至没有为 compareTo 提供正确的正文,因此它不起作用。稍后请不要在这里抛出随机代码。

@Override
public int compareTo(Card otherCard) {
    if (this.rank == otherCard.rank) {
       return this.suite.compareTo(otherCard.suite);
    }
    return this.rank.compareTo(otherCard.rank);
}

请注意,此实现取决于默认枚举顺序,这需要您在 Rank 中按顺序指定 ONE、TWO、THREE...枚举和 DIAMON,...在 Suite枚举

如果您想要定制compareTo对于您的枚举,您必须单独实现它。

关于java - 如何使用比较器方法对枚举对象进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50457010/

相关文章:

java - 解析具有未知值的 JSON

java - 用Java控制数据库中的数据

java - 无法在 Java 中同时使用 STDIN 和 STDERR 读取程序输出

java - 如何在主类的对象上使用扩展类的方法? [JAVA]

java - 读取src中相对静态文件

java - Activity 关闭时停止方法重复

java - 接收数据报包不显示

java - 重写静态内部类中的方法

java - Android - 包含自定义组件会导致其隐藏在主视图后面

java - Spark Java : java. lang.NoClassDefFoundError