我正在制作与卡相关的申请。
西装排名分为俱乐部,钻石,黑桃,红心
我想这样订购:
在卡片中,Ace是最高的,2是最低的,所以标准的Ace King Queen Jack订单会没问题。
我正在尝试使用compareTo方法。我根本不理解它。
我是一个视觉学习者,因此代码示例,如果一步一步地了解如何使用该方法将真正帮助我。它不必与我的代码相关,我可以通过视觉学习来学习和尝试实现的任何东西都会有所帮助。
到目前为止,这是我的代码。如果有人可以告诉我 - 我确实应该实现这一点,这也会有所帮助。
import java.util.Arrays;
public class PlayingCard implements Comparable {
// Class Constants
public static final int ACE = 1;
public static final int KING = 13;
public static final int QUEEN = 12;
public static final int JACK = 11;
public static final String SPADES = "spades";
public static final String CLUBS = "clubs";
public static final String HEARTS = "hearts";
public static final String DIAMONDS = "diamonds";
// Instance Variables
private int rank;
private String suit;
// Constructor
public PlayingCard () {
this.rank = PlayingCard.QUEEN;
this.suit = PlayingCard.SPADES;
}
public PlayingCard (int rank, String suit) {
this.rank = rank;
this.suit = suit;
Arrays.sort();
}
// Mutators
public void setRank (int rank) {
this.rank = rank;
}
public void setSuit (String suit) {
this.suit = suit;
}
// Accessors
public int getRank () {
return this.rank;
}
public String getSuit () {
return this.suit;
}
public String toString () {
return PlayingCard.rankToString(this.rank) + " of " + this.suit;
}
//Class Method
public static String rankToString(int rank) {
switch (rank) {
case(1): return "Ace";
case(2): return "two";
case(3): return "three";
case(4): return "four";
case(5): return "five";
case(6): return "six";
case(7): return "seven";
case(8): return "eight";
case(9): return "nine";
case(10): return "ten";
case(11): return "Jack";
case(12): return "Queen";
case(13): return "King";
}
return "INVALID";
}
public static void main(String [] args) {
// Generate an array of playing cards
PlayingCard [] deck = new PlayingCard[52];
String [] suits = {PlayingCard.CLUBS, PlayingCard.DIAMONDS, PlayingCard.SPADES, PlayingCard.HEARTS};
for(int i = 0; i < suits.length; i++) { // Run through each suit
for (int j = 0; j < 13; j++) { // Make each card
deck[i*13 + j] = new PlayingCard(j+1, suits[i]);
}
}
// Shuffle cards
for(int i = 0; i < deck.length; i++) {
int newPos = (int)(Math.random()*52);
PlayingCard temp = deck[i];
deck[i] = deck[newPos];
deck[newPos] = temp;
}
// Print out cards
System.out.println("Shuffled Deck");
for(int i = 0; i < deck.length; i++) {
System.out.println(deck[i]);
}
// Sort the deck
Arrays.sort(deck);
// Print out cards
System.out.println("\n\nSorted Deck");
for(int i = 0; i < deck.length; i++) {
System.out.println(deck[i]);
}
}
}
答案 0 :(得分:1)
以下是compareTo
类Integer
的示例:
public int compareTo(Object o) {
return this.value - ((Integer)o).value;
}
这不是实际的实现,因为如果你正在处理一个小的负数和一个大的正数,结果可能会溢出。但是,在许多情况下,这种方法就足够了,包括OP。
这会减去此对象的int
值和另一个对象的int
值。想想为什么会这样:
this
大于o
,则减法会产生正值,因此this
被理解为更大。this
小于o
,则减法会产生负值,因此o
被理解为更大。为了帮助使用这个数值方法,您应该给出以适当顺序而不是字符串值排序的套装整数值,并将ACE
定义为14
而不是1
,因为王牌大于国王,即13
。有了这个,您可以编写一个结合两种比较策略的方法:
public int compareTo(Object o) {
PlayingCard other = (PlayingCard) o;
int result = this.suit - other.suit;
if (result != 0)
return result;
return this.rank - other.rank;
}
这将首先比较套装,如果它们相同,则会比较等级。
您必须将compareTo
方法放在PlayingCard
类中,否则如果您实施Comparable
则无法编译。
答案 1 :(得分:1)
诉讼和职级应与调查员一起实施。如果你使用两个类,那么读代码会更容易;甲板班和卡类。
我用枚举器和两个类重新编写程序:
public enum Suit {
Hearts("H"), Spades("S"), Clubs("C"), Diamonds("D");
private final String shortName;
private Suit(String shortName) {
this.shortName = shortName;
}
public String getShortName() {
return shortName;
}
}
public enum Rank {
King("K"), Queen("Q"), Jack("J"), Ten("10"), Nine("9"), Eight("8"), Seven("7"), Six("6"), Five("5"), Four("4"), Three("3"), Two("2"), Ace("E");
private final String shortName;
private Rank(String shortName) {
this.shortName = shortName;
}
public String getShortName() {
return shortName;
}
}
public class PlayingCard implements Comparable<PlayingCard> {
private Suit suit;
private Rank rank;
public PlayingCard(Suit suit, Rank rank) {
this.suit = suit;
this.rank = rank;
}
public String getShortName() {
return suit.getShortName() + rank.getShortName();
}
public String toString() {
return rank + " of " + suit;
}
public Suit getSuit() {
return suit;
}
public Rank getRank() {
return rank;
}
@Override
public int compareTo(PlayingCard other) {
// First compares the ranks and if they're equal the cards are sorted
// by their suits. The rank and suit are always sorted in the order
// they're declared in the enumerators.
if(rank.compareTo(other.getRank()) == 0) {
return suit.compareTo(other.getSuit());
} else {
return rank.compareTo(other.getRank());
}
}
}
public class Deck {
private ArrayList<PlayingCard> deck = new ArrayList<PlayingCard>();
public Deck() {
for(Suit s : Suit.values()) {
for(Rank r : Rank.values()) {
deck.add(new PlayingCard(s, r));
}
}
}
public void shuffle() {
Collections.shuffle(deck);
}
public void sort() {
Collections.sort(deck);
}
public void addToBottom(PlayingCard c) {
deck.add(c);
}
public PlayingCard removeTopCard() {
return deck.remove(0);
}
public PlayingCard peekTop() {
return deck.get(0);
}
public boolean isEmpty() {
return deck.isEmpty();
}
public String toString() {
StringBuilder sb = new StringBuilder();
for(PlayingCard c : deck) {
sb.append(c.getShortName() + ' ');
}
return sb.toString();
}
public static void main(String[] args) {
Deck deck = new Deck();
System.out.println(deck);
deck.shuffle();
System.out.println(deck);
deck.sort();
System.out.println(deck);
System.out.println(deck.peekTop());
}
}
代码创建一个套牌,对其进行洗牌并对其进行排序。它在每次操作后打印甲板。最后它打印出甲板的顶牌。 main()的示例输出是:
HK HQ HJ H10 H9 H8 H7 H6 H5 H4 H3 H2 HE SK SQ SJ S10 S9 S8 S7 S6 S5 S4 S3 S2 SE CK CQ CJ C10 C9 C8 C7 C6 C5 C4 C3 C2 CE DK DQ DJ D10 D9 D8 D7 D6 D5 D4 D3 D2 DE
D7 CE C8 C5 C9 DE SK H7 DQ DK D3 C7 C4 D2 D5 C6 S3 H10 S10 D10 S4 SJ D6 CQ CK D4 H8 H9 S6 HJ HE S8 S7 DJ C10 S2 SQ CJ HK C2 H2 C3 H5 H3 HQ D9 H6 S9 S5 SE H4 D8
HK SK CK DK HQ SQ CQ DQ HJ SJ CJ DJ H10 S10 C10 D10 H9 S9 C9 D9 H8 S8 C8 D8 H7 S7 C7 D7 H6 S6 C6 D6 H5 S5 C5 D5 H4 S4 C4 D4 H3 S3 C3 D3 H2 S2 C2 D2 HE SE CE DE
King of Hearts