2016-05-12 7 views
0

Позвольте мне привести пример того, чего я пытаюсь достичь. Посмотрите только на цифры, потому что это карточная игра.compareTo устанавливает 10 до 2 при сортировке по значению

у меня есть:

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

Я хочу разобраться в этом на величину до:

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

Но я получаю 10 до 2, как это:

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

Этот мой базовый метод сравнения:

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

ответ

1

Потому что String «s (я предполагаю, что this.value является String) compareTo сравнивает лексически, в то время как вы хотите численно. Таким образом, вы должны переопределить его, взять подстроку (или найти последнюю часть, которая является цифра, преобразовать его в Integer, а затем пользователь compareTo на этом Integer.

В общем, я думаю, что ваш класс карты можно было бы улучшить немного. В частности, я хотел бы переписать его:.

 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); 
     } 
     } 

Но вы также можете использовать enum для этой цели

String java API compareTo

+0

вы понимаете мою проблему, но я не могу использовать int (см. Комментарий к другому ответу) – Skupaj

+0

@Skupaj, вы можете сделать это, только переписывая compareTo, но он будет уродливым ... – ACV

+0

Я знаю ... Я попытался собрать возврат в массив, но безуспешно – Skupaj

1

Я предполагаю, что вам нужен обратный порядок? Если это так, то просто изменить реализацию этого:

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

Это действительно зависит от того, какого типа «ценности» является и то, как «CompareTo» реализуются. Кроме того, вы можете просто сделать это, если «значение» является целым числом:

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

Я не хочу, чтобы отменить его и значение является строкой, а не INT, а строка из-за карта dek идет вот так ... 8 9 10 бриллиантов клубов ... – Skupaj

+0

Я делаю все правильно, за исключением того, что 10 помещается перед 2 – Skupaj

+0

Это потому, что 10 сравнивается как строка. «1» - до «2». Вот почему. И поэтому «1», за которым следует «0», предшествует «2». –

1

Я считаю, что ваш значение сохраняется как строка. Если вы не хотите, чтобы изменить тип данных значения, вы можете реализовать метод CompareTo следующим образом:

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

 Смежные вопросы

  • Нет связанных вопросов^_^