[英]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 class
对compareTo
进行如下操作:
@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 compareTo
在KleurKaart
它接受KleurKaart
作为一种类型。 它可以进行特殊的两级(颜色和类型)比较。
取决于您要比较的内容。 例如,KleurKaart(RED)与JOKER类型的颜色名称?
假设我手有小丑,蓝,红,蓬塔卡特。 您希望如何排序? BLUE,JokerKaart,PuntenKaart,RED?
如果是这样,只需比较您已经拥有的toString()(尽管最好为此定义一个明确命名的方法)。
this.toString().compareTo(vergelijkingsKaart.toString())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.