Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为对象列表排序_Java_List_Enums - Fatal编程技术网

Java 为对象列表排序

Java 为对象列表排序,java,list,enums,Java,List,Enums,我正在制作一个模拟纸牌游戏的程序。我有一张代表扑克牌的班级卡: //suit types public enum Suits{ SPADES, CLUBS, HEARTS, DIAMONDS } //value types public enum Values{ TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK,

我正在制作一个模拟纸牌游戏的程序。我有一张代表扑克牌的班级卡:

//suit types
public enum Suits{
    SPADES,
    CLUBS,
    HEARTS,
    DIAMONDS
}

//value types
public enum Values{
    TWO,
    THREE,
    FOUR,
    FIVE,
    SIX,
    SEVEN,
    EIGHT,
    NINE,
    TEN,
    JACK,
    QUEEN,
    KING,
    ACE, 
}

private Suits suit;
private Values value;

//Card constructor
public Card(Values value, Suits suit){
    this.value = value;
    this.suit = suit;
}
在我的游戏课上,我有一个玩家的手牌,由一张牌列表表示:

是否有一种方法可以根据枚举值对玩家进行手动排序?意思是如果玩家的手是:

十,A,二,五

订购后将是:

二,五,十,A


我的条件是Ace总是很高,而西装也不重要。我知道排序列表很简单,我只是不知道如何对基于枚举的对象进行排序。枚举有一个默认排序,即它们实现可比较,因此您可以对枚举列表进行排序,或者在某个比较器中调用ACE.compareTo十。请注意,枚举值的顺序是枚举类中基于序号的定义顺序,请参见下一段,即在您的案例中,二<三<四等

此外,枚举具有序号,即定义内枚举值的索引。在你的例子中,二是序数0,三是序数1,等等

为了对卡片进行排序,您可以使用比较器或实现类似的比较:

class CardComparator implements Comparator<Card> {
  public int compare( Card lhs, Card rhs) {
    //suit would be relevant otherwise you'd end up with spades 10, hearts 10, spades jack etc.
    //thus sort by suit first to keep the cards of a suit together
    int r = lhs.suit.compareTo( rhs.suit ); 

    if( r == 0) { //same suit    
      r = lhs.value.compareTo( rhs.value );
    }
    return r;
  } 
}
使用

用于分类。关于比较国:

new Comparator<Card>() {
  @Override
  public int compare(Card x, Card y) {
    return x.getValue().compareTo(y.getValue());
  }
}

我会为每一套衣服和价值观设定一个值,这样我就可以相互比较。例如:

public enum Suits{
    SPADES(1),
    CLUBS(2),
    HEARTS(3),
    DIAMONDS(4);

    private int value;

    private Suits(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}
和枚举值:

然后,您可以为这些卡实现一个比较器:


您可以实现该接口。您必须为您的Card类重新定义compareTo方法,然后它将允许您执行以下操作:

Card a = ...;
Card b = ...;

if(a.compareTo(b) <= 0) {
    ...
}

请参见

也许您可以创建一个关联数组,并将其用于函数valueOfstring valueFactory===10、valueOfJACK==11等等。。。。然后使用它来排序你的手。实现可比较的类卡。可能的副本用于类似或类似的实现,考虑在枚举内使用枚举。不必要的字段“值”。这不是没有必要的,因为如果你改变了诉讼的顺序并使用序数,你会得到概念上错误的结果。
public enum Suits{
    SPADES(1),
    CLUBS(2),
    HEARTS(3),
    DIAMONDS(4);

    private int value;

    private Suits(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}
public enum Values{
    TWO(2),
    THREE(3),
    FOUR(4),
    FIVE(5),
    SIX(6),
    SEVEN(7),
    EIGHT(8),
    NINE(9),
    TEN(10),
    JACK(11),
    QUEEN(12),
    KING(13),
    ACE(14);

    private int value;

    private Values(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}
public class CardsComparator implements Comparator<Card> {
    public int compare(Card c1, Card c2) {
        //implementation based on the values of Suits and Values.
        if (c1.getSuits().getValue() == c2.getSuits.getValue()) {
            return c1.getValue().compareTo(c2.getValue());
        } else {
            return c1.getSuits().compareTo(c2.getSuits());
        }
    }
}
Collections.sort(listOfCards, new CardsComparator());
Card a = ...;
Card b = ...;

if(a.compareTo(b) <= 0) {
    ...
}
Collections.sort(list);