gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:13:20 28 4
gpt4 key购买 nike

我有一张类(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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com