嗨,我有Card类...在另一个类中,我创建了一个Card对象的arrayList.我将如何根据卡的值对arrayList进行排序?ace是最低的卡值,国王是最高的.
A,2,3,4,5,6,7,8,9,T,J,Q,K
public class Card {
char rank, suit;
public Card(char rank, char suit){
this.rank = rank;
this.suit = suit;
}
public void setCard(char rank, char suit){
this.rank = rank;
this.suit = suit;
}
public char getRank(){
return rank;
}
public char getSuit(){
return suit;
}
public void setRank(char rank){
this.rank = rank;
}
public void setSuit(char suit){
this.suit = suit;
}
public String toString(){
String str = "";
str += this.getRank();
str += this.getSuit();
return str;
}
public boolean equals(Object obj){
Card card = (Card) obj;
if(this.rank == card.getRank() && this.suit == card.getSuit()){
return true;
}
return false;
}
public boolean isValidCard(Card card){
char s = card.getSuit();
char r = card.getRank();
if(s=='H' || s=='S' || s=='D' || s=='C'){
if(r=='A' || r=='2' || r=='3' || r=='4' || r=='5' || r=='6' || r=='7' ||
r=='8' || r=='9' || r=='T' || r=='J' || r=='Q' || r=='K'){
return true;
}
}
return false;
}
public boolean allowedInHigherPiles(Card card, Game game, int pile){
if(pile>=5 && game.getPile(pile).cards.size()==0){
if(card.getRank()!='K')
return false;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
Jou*_*mer 10
如果使用enum来表示排名和套件而不是char,则代码会更加清晰.
实际上,http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html有一个Card示例说明了Enum的使用
相关代码位复制如下
public class Card implements Comparable, java.io.Serializable {
public enum Rank { deuce, three, four, five, six, seven, eight, nine, ten,
jack, queen, king, ace }
public enum Suit { clubs, diamonds, hearts, spades }
private final Rank rank;
private final Suit suit;
private Card(Rank rank, Suit suit) {
if (rank == null || suit == null)
throw new NullPointerException(rank + ", " + suit);
this.rank = rank;
this.suit = suit;
}
public Rank rank() { return rank; }
public Suit suit() { return suit; }
public String toString() { return rank + " of " + suit; }
public int compareTo(Object o) {
Card c = (Card)o;
int rankCompare = rank.compareTo(c.rank);
return rankCompare != 0 ? rankCompare : suit.compareTo(c.suit);
}
private static List<Card> sortedDeck = new ArrayList<Card>(52);
static {
for (Iterator<Rank> i = Rank.VALUES.iterator(); i.hasNext(); ) {
Rank rank = i.next();
for (Iterator<Suit> j = Suit.VALUES.iterator(); j.hasNext(); )
sortedDeck.add(new Card(rank, j.next()));
}
}
// Returns a shuffled deck
public static List<Card> newDeck() {
List<Card> result = new ArrayList<Card>(sortedDeck);
Collections.shuffle(result);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
一个选项是实现Comparable接口,然后覆盖compareTo一旦完成,使用Collections.sort(myCollection)对列表进行排序很容易;
您可能更好地避免实现Comparable并创建Comparator对象,并且有一个版本的Collections.sort采用比较器.
您的比较功能可以简单地检查卡的等级,并在忽略该套装时返回结果.
您可能想要阅读所有这些订购业务的Java教程.
更新:Bjorn正确指出当类具有自然排序顺序时应使用Comparable.我个人的观点是,对于卡片而言,由于不同的游戏对Ace的解释不同,所以并不存在真正的"自然顺序",因此最好通过提供Comparable作为课程的一部分来避免分配"语义".
| 归档时间: |
|
| 查看次数: |
28519 次 |
| 最近记录: |