Я пытаюсь отсортировать ArrayList Строк, которые представляют значения карты. Так, некоторые карты содержат буквы ("Король"), и некоторые содержат Строки, содержащие только номер ("7"). Я знаю для использования Collections.sort, но он только сортирует Строки, которые содержат буквы. Как я заставляю ArrayList быть отсортированным по числу, а также в алфавитном порядке?
Править: Извините, я, должно быть, не обращал много внимания, когда я посмотрел на сортировку. Вид работает правильно, я, должно быть, был просто отброшен тем, что 10 прибудут перед 2. Спасибо
Как я понимаю, у вас есть массив вида ["7", "Queen", "9", "6"]
и вы хотите, чтобы после сортировки он выглядел как ["Queen", "9", "7", "6"]
(или в обратном порядке).
Я бы посоветовал сделать его более объектно-ориентированным, т.е. создать класс Card с полями name и value:
class Card {
private final String name;
private final int value;
...
//constructor and getters
}
и после этого создавать экземпляры таким образом:
Card six = new Card("6", 6);
Card ten = new Card("10", 10);
Card queen = new Card("Queen", 12);
После этого будет гораздо проще делать все операции с карточками (и сортировку в частности), используя поле value
вместо имен карточек.
Как сказал @Jon Skeet, встроенная сортировка будет сравнивать на основе значений Unicode. Вам придется написать свой собственный метод сортировки.
Однако, раз уж вы пишете свой собственный код, могу ли я предложить перечисление? Колода карт - один из канонических примеров использования перечислений. Краткая версия заключается в том, что вы можете объявить свой собственный порядок сортировки для группы вещей; вы даже можете сделать так, чтобы пиковый король опережал бубнового короля, если захотите. Посмотрите учебник Sun здесь.
Сортировка - сортировка всего в соответствии с вашей кодировкой. Другими словами, все числа будут стоять перед буквами в лексикографическом порядке. Например, десятичные числа начинаются с символа "." и не в порядке лексикографически.
Если вы хотите изменить это, создайте объект Comparator. Затем вы можете расположить элементы в любом порядке.
Например, это будет отсортировать числа в числовом порядке, а также слова в лексическом порядке:
class CardComparator extends Object implements Comparator{
public int compare(Object a, Object b){
try{
double d1=Double.valueOf(a.toString());
try{
double d2=Double.valueOf(b.toString());
return (d2>d1)?1:-1; // both numeric
}catch(NumberFormatException e){ // a is numeric but b isn't
return 1;
}
}catch(NumberFormatException e){
try{
double d2=Double.valueOf(b.toString());
return -1; // a is nonnumeric but b is
}catch(NumberFormatException e){ // both nonnumeric
return a.toString().compareTo(b.toString);
}
}
}
}
Comparator comparator=new CardComparator();
Collections.sort(cards, comparator);
PS не проверено!
Нет, Collections.sort
будет сортировать все, используя порядковое лексикографическое сравнение Unicode, так как это поведение String.compareTo
. "7" окажется перед "King", а "10" - перед "2".
Я знаю, что нужно использовать Collections.sort, но он сортирует только строки, содержащие буквы. Как сделать так, чтобы ArrayList сортировался по номерам и по алфавиту?
Если строка является номером, то она уже сортируется (как строка), смотрите:
import java.util.*;
class Sort {
public static void main( String [] args ) {
List list = Arrays.asList("Kings","7", "Abcd", "3.1416");
Collections.sort( list );
System.out.println( list );
}
}
Prints
$ java Sort
[3.1416, 7, Abcd, Kings]
Это то, что вам нужно?
edit
Если предположить (догадаться), что вам нужно отсортировать колоду карт, в которой есть и числа, и "буквы" (J, Q, K, A), то можно попробовать использовать пользовательский компаратор.
Вот один из них, который учитывает числа "как числа", а остальное как строки, так что "10" идет после "2", но перед "Королями"
import java.util.*;
class Sort {
public static void main( String [] args ) {
List<String> list = Arrays.asList("Kings","7", "Queen", "3", "10", "A", "2", "8", "Joker");
Collections.sort( list , new Comparator<String>(){
public int compare( String a, String b ){
// if both are numbers
if( a.matches("\\d+") && b.matches("\\d+")) {
return new Integer( a ) - new Integer( b );
}
// else, compare normally.
return a.compareTo( b );
}
});
System.out.println( list );
}
}
$ java Sort
[2, 3, 7, 8, 10, A, Joker, Kings, Queen]
Если это то, что вам нужно, я думаю, это поможет вам разобраться с остальным. Вероятно, следующим будет то, как сортировать пики и червы.
Следуя ответу Roman, вы можете создать класс и реализовать интерфейс Comparable:
class Card implements Comparable<Card> {
public int compareTo( Card other ) {
// add custom logic to compare one card with other
}
}