2016-05-12 9 views
0

Lassen Sie mich Ihnen ein Beispiel geben für das, was ich erreichen möchte. Schau nur auf die Zahlen, weil es ein Kartenspiel ist.compareTo setzt 10 vor 2 beim Sortieren nach Wert

ich habe:

harten5 klaveren4 klaveren7 schoppen5 ruiten5 schoppen2 klaverenheer schoppenheer schoppendame schoppen6 klaverenboer schoppen8 ruitenheer klaveren6... 

ich dies auf den Wert sortiert werden soll:

schoppen2 harten2 ruiten2 klaveren2 ruiten3 harten3 schoppen3 klaveren3 klaveren4 harten4 schoppen4 ruiten4 harten5 schoppen5 ruiten5... 

aber ich habe den 10 vor dem 2 wie folgt aus:

schoppen10 ruiten10 harten10 klaveren10 schoppen2 harten2 ruiten2 klaveren2 ruiten3 harten3 schoppen3 klaveren3... 

Diese ist meine grundlegende compareTo Methode:

@Override 
public int compareTo(Card p) { 
    return this.value.compareTo(p.value); 
} 

Antwort

1

Weil String ‚s (ich denke, this.valueString ist) compareTo vergleicht lexikografisch, während Sie numerisch möchten. So haben Sie es neu implementieren, nehmen String (oder den letzten Teil finden, die eine Ziffer ist, wandelt es in Integer und dann Benutzer compareTo auf diesem Integer.

Generell denke ich, Ihre Klasse-Karte ein wenig verbessert werden könnte. insbesondere würde ich es umschreiben.

 class Card { 
     private String value; 
     private Integer rank; 


     ... 

     public int compareTo(Card c) { 
      // Additional logic if you need to consider 
// also value (suite) in comparison 
      return this.rank.compareTo(c.rank); 
     } 
     } 

Sie können aber auch eine enum für diesen Zweck verwenden

String java API compareTo

+0

Sie verstehen mein Problem, aber ich kann Int nicht verwenden (siehe Kommentar zu anderer Antwort) – Skupaj

+0

@Skupaj, können Sie dies tun, indem Sie nur compareTo neu schreiben, aber es wird hässlich sein ... – ACV

+0

Ich weiß ... Ich habe versucht zu sammeln die Rückkehr in ein Array, aber ohne Erfolg – Skupaj

1

Ich vermute, Sie wollen die umgekehrte Reihenfolge? Wenn ja, dann ändern Sie einfach Ihre Implementierung dieser:

@Override 
public int compareTo(Card p) { 
    return p.value.compareTo(this.value); 
} 

Es hängt wirklich davon ab, was die Art der „Wert“ ist und wie die „compareTo“ umgesetzt wird. Alternativ können Sie dies nur tun, wenn „Wert“ eine ganze Zahl:

@Override 
public int compareTo(Card p) { 
    return this.value - p.value; 
} 
+0

Ich will es nicht umkehren und Wert ist ein String und kein int sondern eine Zeichenfolge, weil eine Karte dek geht so ... 8 9 10 Clubs Diamanten ... – Skupaj

+0

Ich mache alles richtig, außer dass die 10 vor dem 2 – Skupaj

+0

liegt Es liegt daran, dass 10 als String verglichen wird. '1' ist vor '2'. Deshalb. Und daher kommt '1', gefolgt von '0' vor '2'. –

1

ich glaube, Ihr Wert wird als String gespeichert. Wenn Sie nicht über den Datentyp Wert ändern möchten, können Sie die Methode compareTo in der folgenden Art und Weise implementieren:

public int compareTo(Card p) { 
     return Integer.parseInt(this.value).compareTo(Integer.parseInt(p.value)); 
    }   
Verwandte Themen