使用Java

时间:2016-07-13 09:30:06

标签: java

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

我有一个抽象类Kaart(卡片),有3个子类:Joker,KleurKaart(ColourCard),PuntenKaart(PointsCard)。所有子类都有一个属性" type" (Joker,KleurKaart,PuntenKaart),但KleurKaart有第二个属性叫做kleur(颜色)。

问题是:在这种情况下,如何按字母顺序对玩家的手进行排序? Joker和PuntenKaart很简单,比较类型,但是对于KleurKaart,我首先要检查给定的Kaart是否是KleurKaart的一个实例,然后比较其他卡片'输入kleur?我不明白。

类Kaart

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

4 个答案:

答案 0 :(得分:1)

将此代码添加到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实例上调用compareTo()时,即使您在执行代码时不知道它是KleurKaart,也会使用新的compareTo()方法。

基本上检查两张卡的类型如果类型为相同 AND ,则另一张卡为彩色 * 然后 比较两张卡的两个颜色并返回该结果,否则返回super.compareTo()方法的结果。

提示:实际上有一个名为颜色的类通常用于图形,因此如果有额外的功能,例如打印卡片,那么我建议你将颜色类型更改为颜色。

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

解决此问题的另一种方法是将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()方法可以检查哪个字符串首先出现。

答案 1 :(得分:0)

我认为您应该能够在compareTo中添加KleurKaart作为类型接受KleurKaart。它可以进行特殊的两级(颜色和类型)比较。

答案 2 :(得分:0)

您应该在compareTo中提取KleurKaart class,如下所示:

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

答案 3 :(得分:0)

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

说我有手JOKER,BLUE,RED,PuntenKaart。你期望如何排序? BLUE,JokerKaart,PuntenKaart,RED?

如果是这样,只需比较已经存在的toString()(尽管为此定义一个明确命名的方法可能更好)。

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