2016-03-27 40 views
2

In meinem MainActivity ich diese Zeilen Code haben:Java Strings Objekt in Arraylist

//data.getFirstUserInput()-1 is equal to user input. 
    deck.setCardNumberEmpty(data.getFirstUserInput()-1); 

     System.out.println("\n Cards on table"); 
       ArrayList<Deck> deck= deck.getCards(); 
        Collections.sort(cards); 
        for (Deckc: deck 
      System.out.print((format("%10s","\033[F[ " + c.getOneSpecificNumber())+ " ]"));} 

Dies druckt meine zufällige Kartennummern aus. Aber das Problem ist, sie sind nicht numerisch sortiert,

Eine Idee, was ich tun kann?

Karte Klasse

public class Card { 

    private String cardLetter; 
    private String cardNumber; 
    private String nullValue; 

    public Card(String cardLetter, String cardNumber, String nullValue){ 
     this.cardLetter = cardLetter; 
     this.cardNumber = cardNumber; 
     this.nullValue = nullValue; 
    } 

    public String getOneSpecificNumber() { return cardNumber;} 
    public void setCardNumber(String x){ cardNumber = x; } 


private ArrayList<Deck> deck = new ArrayList(); 
public Deck(){ 
        char A = 'A'; 
    int repeats = 2, numOfCards = 8; 
    for (int i = 0; i<numOfCards;i++){ 
     for (int j = 0; j<repeats; j++){ 
      cards.add(new Card((char) (A + i) + "",i+1,"")); 
     } 
    } 
} 

Antwort

5

Um die cards Array gemäß der cardNumber Ihre Card Klasse zu sortieren hat die Comparable und außer Kraft setzen compareTo() zu implementieren. Hier

ist der Code-Schnipsel:

public class Card implements Comparable<Card> { 

    private String cardLetter; 
    private String cardNumber; 
    private String nullValue; 

    public Card(String cardLetter, String cardNumber, String nullValue){ 
     this.cardLetter = cardLetter; 
     this.cardNumber = cardNumber; 
     this.nullValue = nullValue; 
    } 

    public int compareTo(Card c) { 
     if(StringUtils.isEmpty(this.cardNumber) || 
      StringUtils.isEmpty(c.cardNumber)) return -1; 
     return Integer.parseInt(this.cardNumber) - Integer.parseInt(c.cardNumber); 
    } 

    public String getOneSpecificNumber() { return cardNumber; } 

    public void setCardNumber(String x) { cardNumber = x; } 
} 

StringUtils ist ein Teil von Apache Commons LANG3, wenn Sie wollen es in Ihrem Projekt nicht enthalten, dann können Sie etwas tun:

if(null == this.cardNumber || "".equals(this.cardNumber) || 
     null == c.cardNumber || "".equals(c.cardNumber)) return -1; 

Jetzt müssen Sie nur noch diese sortieren, um zu tun:

Collections.sort(cards); 

Beispiel:

System.out.println("\n Cards on table"); 
List<Card> cards = deck.getCards(); 
Collections.sort(cards); 
for (Card c: cards) { 
    System.out.print((format("%10s","\033[F[ " + c.getOneSpecificNumber())+ " ]")); 
} 
+0

public int compareTo (Karte c) { return this.cardNumber - c.cardNumber; } Ich bin mir nicht sicher, was dieses Stück Code tut, aber es gibt mir einen Fehler. „Bad Operandentypen für binären operator'-‘ ersten Typen: String zweiter Typ: String – user3506

+0

Exception in thread "main" java.lang.NumberFormatException: Für Eingabestring: "" Jede Idee, warum ich diesen Fehler bekommen? Versucht über die Annotation, aber es ist das gleiche Problem – user3506

+0

@ user3506 Sie haben 'null' oder leere Werte in' cardNumber' .Fügen Sie eine Prüfung, um eine Ausnahme zu verhindern.Ich habe die Antwort mit den 'StringUtils' aktualisiert. Entscheiden Sie die Reihenfolge richtig in solchen Fällen. – user2004685