当前位置: 首页 > 知识库问答 >
问题:

如何使用comparetor方法对枚举对象进行排序?

阚正真
2023-03-14

我有一张班级卡和一张班级手牌。我还有两个编号:
套装,包含值:钻石、棍棒、心脏、黑桃
和等级,包含值:二、三、四、五、六、七、八、九、十、杰克、皇后、国王、王牌

Hand类有一个链接到Card类的arraylist。我想重写Hand类中的compareto()方法,以便按照秩值对卡片对象进行排序​​按此顺序:

二、三、四、五、六、七、八、九、十、杰克、女王、国王、王牌。

如果有两张牌具有相同的等级值,则应按照以下顺序按套装值排序:

钻石,俱乐部,心脏,铲子,按升序排列。

例如,如果一手牌中有牌:黑桃二、钻石二、心牌、梅花九。那么当我打电话给收款人的时候。sort()在包含卡片的arraylist上,应按以下顺序打印:菱形2、黑桃2、梅花9、心形A。

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

}

}

共有1个答案

宰父淳
2023-03-14

首先,让你的类实现可比

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

请注意,此实现取决于默认枚举顺序,这要求您指定一、二、三。。。按enum和DIAMON的顺序排列。。。在套件中

如果要为枚举自定义比较,则必须单独实现它。

 类似资料:
  • 问题内容: 我有一个对象数组: 如何获得按属性名称升序排列的数组? 我尝试这样做:,但这不起作用。 请帮我! 编辑:数组可以包含两个以上的对象!它可以包含数百个。 编辑: 为什么在“重复的”问题问了两年之前,这个问题为什么被标记为重复? 问题答案:

  • 问题内容: 如何枚举JavaScript对象的属性? 我实际上想列出所有已定义的变量及其值,但是我了解到定义一个变量实际上会创建window对象的属性。 问题答案: 很简单: 现在,您将无法以这种方式获取私有变量,因为它们不可用。 编辑:是正确的,除非您使用该方法,否则您将获得继承的属性- 但是,我不知道为什么任何熟悉面向对象编程的人都期望得到更少的东西!通常,提起此问题的人会受到道格拉斯·克罗克

  • 问题内容: 我有一个如下的JavaScript对象: 现在我想通过所有回路元素(,,…),并得到他们的键和值。我怎样才能做到这一点? 我可以根据需要修改JavaScript对象。我的最终目标是遍历一些键值对,如果可能的话,我想避免使用。 问题答案: 您可以使用其他人所示的循环。但是,您还必须确保获得的键是对象的实际属性,而不是来自原型。 这是代码段: 用Object.keys()替代: 请注意,使

  • 问题内容: 我已经寻找了一段时间,想要一种对JSON对象进行排序的方法,如下所示: 并按字母顺序按值“ COMMERCIALNAME_E”得到: 我找不到任何可以做到这一点的代码。谁能给我些帮助? 问题答案: 将这些JSON解析为“对象集合”,然后使用比较器通过您喜欢的字段对其进行排序。 使用GSON将其解析为对象集合 例: 如果要从Object创建JSON。

  • 我用的是Java 8号。我有一份汽车物品清单。我想按特定的顺序对它们进行排序。 每个汽车对象都属于一个模型。我喜欢按型号对汽车对象列表进行排序。排序后的列表应该是按照以下顺序,有车型的轿车SEDAN,然后是宝马,然后是独角兽。 所以当我打印排序后的列表时,它应该是这样的 如何使用自定义比较器在模型枚举上实现这种排序顺序。 如果你能帮忙,我很感激

  • 问题内容: 我有一个如下的枚举类: 在我的代码后面,我基本上遍历了Letter枚举,并将其成员打印到控制台: 我认为值()方法会给我的枚举的有序视图(如提到这里),但这里不是这种情况。我只是按照在Letter枚举类中创建它们的顺序来获得枚举成员。有没有一种方法可以按字母顺序输出枚举的值?我需要一个单独的比较器对象,还是有内置的方法来执行此操作?基本上,我希望根据getDescription()文本