2016-07-13 26 views
0

對於學校項目,我必須製作一個紙牌遊戲。牌可以有不同的類型(小丑,PuntenKaart,KleurKaart)。每個玩家都擁有一張牌(顯然)有多種不同組合。按字母順序排列使用Java中不同屬性的多個不同對象的列表

我有一個抽象類Kaart(卡),有3個子類:Joker,KleurKaart(ColourCard),PuntenKaart(PointsCard)。所有的子類都有一個屬性「type」(Joker,KleurKaart,PuntenKaart),但是KleurKaart有第二個屬性叫做kleur(color)。

下面是一個問題:如何在這種情況下按字母順序排列玩家的手?小丑和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; 
    } 
} 

回答

0

要看你要比較的。例如,KleurKaart(RED)和類型JOKER的顏色名稱?假設我有手JOKER,BLUE,RED,PuntenKaart。你如何期望被排序? BLUE,JokerKaart,PuntenKaart,RED?

如果是這樣,只需比較您已經使用的toString()(儘管最好爲此定義一個明確命名的方法)。

this.toString().compareTo(vergelijkingsKaart.toString()) 
+0

謝謝!我用這個答案的代碼,因爲,對我的新手來說,它似乎是最簡單的。它完美地完成了這項工作! 感謝所有人的幫助。我沒有使用你的答案,但它幫助我更多地理解編程,所以我不會說這一切都是徒勞的。 – user3649731

0

我想你應該能夠在KleurKaart它接受KleurKaart作爲一種補充anothor compareTo。它可以執行特殊的兩級(顏色和類型)比較。

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()方法。

所以基本上檢查類型的兩張卡。 如果的類型是相同其他卡是有色*然後比較兩個顏色的兩張牌並返回結果,否則返回super.compareTo()方法的結果。

提示:其實有一個叫顏色,它通常用於圖形類,所以如果有額外的功能,如打印的卡片,那麼我建議你改變顏色的類型,顏色。

*(無需檢查此卡,因爲它已經因爲KleurKaart的一個實例,這個的compareTo()方法只存在於KleurKaart)

另一種方式來解決這個問題是要改變KleurKaart的toString()方法來

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

而該地圖的的compareTo()方法超類

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

因此,您可以將所有需要的東西寫入toString()類,並且compareTo()方法可以檢查哪個字符串先行。

+0

@ user3649731如果您喜歡它並認爲它完全回答了您的問題,您能接受此答案嗎? –

0

你應該ovverride在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; 
} 
相關問題