作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一张类(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/
我是一名优秀的程序员,十分优秀!