ArrayList中的Java排序对象
嗨,我有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; } }
一种选择是实现Comparable接口,然后覆盖compareTo一旦完成,使用Collections.sort(myCollection)可以轻松地对列表进行排序;
您最好避免实现Comparable并创建Comparator对象,并且有一个Collections.sort版本可以使用比较器。
您的比较function可以简单地检查卡的等级,并在忽略该套装时返回结果。
您可能希望阅读所有这些订购业务的Java教程。
更新:Bjorn正确指出当类具有自然排序顺序时应使用Comparable。 我个人的观点是,对于卡片而言,实际上没有“自然顺序”,因为不同的游戏对Ace的解释不同,所以最好通过提供Comparable作为课程的一部分来避免分配“语义”。
如果使用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 sortedDeck = new ArrayList (52); static { for (Iterator i = Rank.VALUES.iterator(); i.hasNext(); ) { Rank rank = i.next(); for (Iterator j = Suit.VALUES.iterator(); j.hasNext(); ) sortedDeck.add(new Card(rank, j.next())); } } // Returns a shuffled deck public static List newDeck() { List result = new ArrayList (sortedDeck); Collections.shuffle(result); return result; } }
缺少CompareTo代码:
ArrayList aCardList = new ArrayList (); Collections.sort(aCardList, new Comparator () { @Override public int compare(Card o1, Card o2) { if (o1.getRank() > o2.getRank()) return -1; else if (o1.getRank() < o2.getRank()) return 1; else return 0; } });
您可以实现Comparable接口,以便按等级比较元素。 然后Collections.sort将自动执行您期望的操作。
一些较短的方法
public String toString() { return "" + rank + suit; } public boolean isValidCard(){ return "HSDC".indexOf(suit) != -1 && "A23456789TJQK".indexOf(rand) != -1; }
您可以使用java.util.Collections类对其进行排序。 特别是,两种方法可能会派上用场:
static > void sort(List list) Sorts the specified list into ascending order, according to the natural ordering of its elements. static void sort(List list, Comparator super T> c) Sorts the specified list according to the order induced by the specified comparator.
对于第一种方法,您应该使您的Card类实现Comparable接口。对于第二种方法,您应该提供自定义比较器。
这样做是为了让集合框架知道如何比较您的Card对象。
所以,例如(第一种方法),您将拥有以下代码:
在你的卡类
public Class Card implements Comparable{ //member and method definitions. public int compareTo(Object o){ //null checks && stuff missing. /*compares two cards based on rank.*/ } List cards = getAllCards();//returns an unsorted list implementation of Card objects. java.util.Collections.sort(cards);
public class ClassName implements Comparable
public class player { String Fname = ""; String Lname = ""; ArrayList cards= new ArrayList (); public String getFname() { return Fname; } public void setFname(String Fname) { this.Fname = Fname; } public String getLname() { return Lname; } public void setLastname(String Lname) { this.Lname = Lname; } public ArrayList getCards() { return cards; } public void setCards(ArrayList cards) { this.cards = cards; } public player(String fname,String lname) { this.Fname = fname; this.Lname = lname; } public void AddCard(Card card){ cards.add(card); } public void showCards(){ System.out.println(""+Fname+" "+Lname+" holds the following cards"); for (int i=0;i