繁体   English   中英

使用Java中的不同属性按字母顺序对具有多个不同对象的列表进行排序

[英]Alphabetically Sorting List with multiple different objects using different attributes in Java

对于学校项目,我必须制作纸牌游戏。 这些卡可以具有不同的类型(Joker,PuntenKaart,KleurKaart)。 每个玩家的一手都有多种不同的纸牌组合(很明显)。

我有一个抽象类Kaart(卡),有3个子类:Joker,KleurKaart(ColourCard),PuntenKaart(PointsCard)。 所有子类都具有属性“类型”(Joker,KleurKaart,PuntenKaart),但是KleurKaart具有第二个属性kleur(颜色)。

问题是:在这种情况下,如何按字母顺序对玩家的手进行排序? Joker和PuntenKaart很简单,只需比较类型,但是使用KleurKaart,我首先必须检查给定的Kaart是否是KleurKaart的实例,然后将其他卡的类型与kleur进行比较? 我不明白。

班级

package domein;

public abstract class Kaart implements Comparable<Kaart>{

     private String type;

     public Kaart(String type){
         this.type = type;
     }

     public String getType(){
         return type;
     }

     @Override
     public int compareTo(Kaart vergelijkingsKaart) {
         return type.compareTo(vergelijkingsKaart.type);
     }

     @Override
     public String toString(){
         return this.type;
     } 
}

小丑类

package domein.kaarten; 
import domein.Kaart;

public class Joker extends Kaart {
     public Joker() {
         super("JokerKaart");
     }  
}

PuntenKaart类

package domein.kaarten; 
import domein.Kaart;

public class PuntenKaart extends Kaart {
    public PuntenKaart() {
        super("PuntenKaart");
    } 
}

班级KleurKaart

package domein.kaarten; 
import domein.Kaart;

public class KleurKaart extends Kaart {
     private String kleur;

     public KleurKaart(String kleur) {
         super("KleurKaart");
         this.kleur = kleur;
     }

     public String getKleur(){
         return this.kleur;
     }

     @Override
     public String toString(){
         return this.kleur;
     } 
}

将此代码添加到您的KleurKaart类中:

 @Override
 public int compareTo(Kaart vergelijkingsKaart) {
     int superReturn = super.compareTo(vergelijkingsKaart);//check how the types of the two cards compare.
     if(superReturn == 0){//if they are the same then do some more checking otherwise return the output of the first check.
        if(vergelijkingsKaart isinstanceof KleurKaart){//if the other card is also a colored card then compare the colours otherwise return the result of the first check.
            KleurKaart otherKaart = ((KleurKaart) vergelijkingsKaart);//cast the other card
            return kleur.compareTo(otherKaart.getgetKleur());//compare the colours.
        }
     }
     return superReturn
 }

这将覆盖超类中的compareTo()方法。 因此,即使您在执行代码时不知道它是KleurKaart时,在KleurKaart实例上调用compareTo()时,也会使用新的compareTo()方法。

因此,基本上检查两张卡的类型 如果类型是相同的 其他卡是有色*, 然后 比较这两个卡的两种颜色 ,并返回结果,否则返回super.compareTo()方法的结果。

提示:实际上有一个称为Color的类,通常用于图形 ,因此,如果有其他功能,例如打印卡片,则建议您将颜色类型更改为Color。

* (无需检查此卡,因为它已经是KleurKaart的实例,因为此compareTo()方法仅存在于KleurKaart中)

解决此问题的另一种方法是将KleurKaart的toString()方法更改为

 @Override
 public String toString(){
     return super.toString() + "  " +  this.type;
 } 

还有Kaart超类的compareTo()方法

 @Override
 public int compareTo(Kaart vergelijkingsKaart) {
     return this.toString().compareTo(vergelijkingsKaart.toString());
 }

因此,您可以在toString()类中完全编写所需的所有内容,并且compareTo()方法可以检查哪个字符串排在最前面。

您应该在KleurKaart classcompareTo进行如下操作:

 @Override
 public int compareTo(Kaart vergelijkingsKaart) {
     int result = super.compareTo(vergelijkingsKaart.type);
     if(result==0) { //they are both KleurKaart objects
         return ((KleurKaart)this).kleur.compareTo(((KleurKaart)vergelijkingsKaart).kleur);
     }
     return result;
 }

我想你应该能够添加anothor compareToKleurKaart它接受KleurKaart作为一种类型。 它可以进行特殊的两级(颜色和类型)比较。

取决于您要比较的内容。 例如,KleurKaart(RED)与JOKER类型的颜色名称?

假设我手有小丑,蓝,红,蓬塔卡特。 您希望如何排序? BLUE,JokerKaart,PuntenKaart,RED?

如果是这样,只需比较您已经拥有的toString()(尽管最好为此定义一个明确命名的方法)。

this.toString().compareTo(vergelijkingsKaart.toString())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM