对于学校项目,我必须做一个纸牌游戏。这些牌可以有不同的类型(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;
}
}
答案 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())