ArrayList 中的 Java 排序对象

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/791429/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 19:32:09  来源:igfitidea点击:

Java Sorting object in ArrayList

javacollections

提问by user69514

Hi I have Card class... In another class I create an arrayList of Card objects. How would I go about sorting the arrayList based on the value of the card? The ace is the lowest card value and the king is the highest.

嗨,我有 Card 类...在另一个类中,我创建了一个 Card 对象的 arrayList。我将如何根据卡的值对 arrayList 进行排序?王牌是最低的卡值,国王是最高的。

A,2,3,4,5,6,7,8,9,T,J,Q,K

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

}

采纳答案by Uri

One option is to implement the Comparable interface and then override compareTo Once you've done that, sorting the list is easy with Collections.sort(myCollection);

一种选择是实现 Comparable 接口,然后覆盖 compareTo 完成后,使用 Collections.sort(myCollection) 可以轻松对列表进行排序;

You may be better of avoiding implementing Comparable and create a Comparatorobject, and there's a version of Collections.sort that takes the comparator.

您最好避免实现 Comparable 并创建一个Comparator对象,并且有一个版本的 Collections.sort 接受比较器。

Your comparison function can can then simply check the rank of the cards, and return the result while ignoring the suit.

然后,您的比较函数可以简单地检查卡片的等级,并在忽略花色的情况下返回结果。

You may want to read the Java tutorial on all this ordering business.

您可能想阅读有关所有这些订购业务的 Java 教程。

Update: Bjorn points out correctly that Comparable should be used when the class has a natural sorting order. My personal view is that for cards there isn't really a "natural order" since different games differ in their interpretation of the Ace, so it might be better to avoid assigning "semantics" by offering Comparable as part of the class.

更新:Bjorn 正确地指出,当类具有自然排序顺序时应该使用 Comparable。我个人的观点是,对于卡片来说,并没有真正的“自然顺序”,因为不同的游戏对 A 的解释不同,因此最好通过提供 Comparable 作为类的一部分来避免分配“语义”。

回答by Stephan202

You can implement the Comparableinterface such that the elements are compared by rank. Then Collections.sortwill automatically do what you expect it to do.

您可以实现Comparable接口,以便按等级比较元素。然后Collections.sort将自动执行您期望它执行的操作。

回答by Tom

You could use thejava.util.Collectionsclass to sort it. Particularly, two methods may come handy:

您可以使用java.util.Collections类对其进行排序。特别是,两种方法可能会派上用场:

 static <T extends Comparable<? super T>>
 void sort(List<T> list)
      Sorts the specified list into ascending order, according to the natural ordering of its elements.

static <T> void sort(List<T> list, Comparator<? super T> c)
      Sorts the specified list according to the order induced by the specified comparator.

For the first method, you should make your Card class implement the Comparable interface.. For the second one, you should provide a custom comparator.

对于第一种方法,您应该让 Card 类实现 Comparable 接口。对于第二种方法,您应该提供自定义比较器。

This is done in order for the collections framework to know how to compare your Card objects.

这样做是为了让集合框架知道如何比较您的 Card 对象。

So, for example (first method), you would have this code:

因此,例如(第一种方法),您将拥有以下代码:

In your card class

在你的卡片类

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<Card> cards = getAllCards();//returns an unsorted list implementation of Card objects.

java.util.Collections.sort(cards);

回答by Journeyman Programmer

The code would be much cleaner if you use enum to represent rank and suite instead of char.

如果您使用 enum 代替 char 来表示等级和套件,代码会更简洁。

In fact, http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.htmlhas a Card sample illustrates use of Enum

事实上,http://jcp.org/aboutJava/communityprocess/jsr/tiger/enum.html有一个 Card 示例说明了 Enum 的使用

The relevant code bit is copied below

相关码位复制如下

public class Card implements Comparable, java.io.Serializable {
    public enum Rank { deuce, three, four, five, six, seven, eight, nine, ten,
                       Hyman, 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;
    }
}

回答by Peter Lawrey

A couple of shorter methods

几个较短的方法

public String toString() {
   return "" + rank + suit;
}

public boolean isValidCard(){
    return "HSDC".indexOf(suit) != -1 &&
         "A23456789TJQK".indexOf(rand) != -1;
}

回答by Azder

The Missing CompareTo code:

缺少的 CompareTo 代码:

ArrayList<Card> aCardList = new ArrayList<Card>();

    Collections.sort(aCardList, new Comparator<Card>() {

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

回答by kutluk

public class ClassName implements Comparable<Object> {

    // Variables --------------------------------------------
    private double  comparedVariable; 


    // Constructor ------------------------------------------
    public ClassName (){}


    // Functions --------------------------------------------
    //returns the fuel weight
    public double getComparedVariable() {
        return comparedVariable;
    }


    // Overrides --------------------------------------------
    @Override
    public int compareTo(Object o) {

        ClassName classObject = (ClassName) o;

        if (this.comparedVariable> classObject.getComparedVariable())
            return 1; //make -1 to sort in decreasing order
        else if (this.comparedVariable< classObject.getComparedVariable())
            return -1;//make 1 to sort in decreasing order
        else
            return 0;
    }

}

回答by donnnn

public class player {
? ? ?String Fname = "";
? ? String Lname = "";
? ? ArrayList<Card> cards= new ArrayList<Card> ();
? ? 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<Card> getCards() {
? ? ? ? return cards;
? ? }

? ? public void setCards(ArrayList<Card> 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<cards.size();i++)
? ? ? ? {
? ? ? ? ? ? System.out.print(cards.get(i).toString());
? ? ? ? }
? ? ? ? System.out.println();
? ? }
? ??
? ? public void Sortcardsbyface()
? ? {
? ? ? ? for (int i = 0; i < cards.size() - 1; i++)
? ? ? ? {
? ? ? ? ? ? int j = i;
? ? ? ? ? ? for (int k = i + 1; k < cards.size(); k++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Card c = new Card();
? ? ? ? ? ? ? ? if (c.toInt(cards.get(k).getFace()) < c.toInt(cards.get(j).getFace()))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? j=k;
? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? Card temp = cards.get(j);
? ? ? ? ? ? cards.set(j,cards.get(i));
? ? ? ? ? ? cards.set(i,temp);

? ? ? ? }
? ? ? ? showCards();
? ? }
}


/*
?* To change this license header, choose License Headers in Project Properties.
?* To change this template file, choose Tools | Templates
?* and open the template in the editor.
?*/
package pokegame;

/**
?*
?* @author admin
?*/
public class Card {
? ? ?private String face;
? ? private char suit;?

? ? Card(char suit,String face) {
? ? ? ? this.suit = suit;
? ? ? ? this.face = face;
? ? }

? ? Card() {
? ? ? ??
? ? }

? ? public String getFace() {
? ? ? ? return face;
? ? }

? ? public void setFace(String face) {
? ? ? ? this.face = face;
? ? }

? ? public char getSuit() {
? ? ? ? return suit;
? ? }

? ? public void setSuit(char suit) {
? ? ? ? this.suit = suit;
? ? }
? ?
? ? public String toString(){
? ? ? ? return face+suit; ?
? ? }
??
? ??
? ? public int toInt(String face){
? ? ? ? switch(face){
? ? ? ? ? ? case "A":
? ? ? ? ? ? ? ? return 1;
? ? ? ? ? ? case "J":
? ? ? ? ? ? ? ? return 11;
? ? ? ? ? ? case "Q":
? ? ? ? ? ? ? ? return 12;
? ? ? ? ? ? case "K":
? ? ? ? ? ? ? ? return 13;
? ? ? ? ? ? case "2":
? ? ? ? ? ? ? ? return 2;
? ? ? ? ? ? case "3":
? ? ? ? ? ? ? ? return 3;
? ? ? ? ? ? case "4":
? ? ? ? ? ? ? ? return 4; ? ? ? ?
? ? ? ? ? ? case "5":
? ? ? ? ? ? ? ? return 5; ? ? ? ?
? ? ? ? ? ? case "6":
? ? ? ? ? ? ? ? return 6;
? ? ? ? ? ? case "7":
? ? ? ? ? ? ? ? return 7; ? ?
? ? ? ? ? ? case "8":
? ? ? ? ? ? ? ? return 8; ? ?
? ? ? ? ? ? case "9":
? ? ? ? ? ? ? ? return 9; ? ?
? ? ? ? ? ? case "10":
? ? ? ? ? ? ? ? return 10; ? ?
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ??
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? return 0;
? ? ? ? }
? ? }
? ??
}