Używam Collections.sort, ale sortuje tylko ciągi zawierające litery. Jak mogę posortować listę ArrayList według numerów, a także alfabetycznie?
Jeśli ciąg jest liczbą jest już klasyfikowane (jako ciąg chociaż) wygląd:
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);
}
}
Drukuje
$ java Sort
[3.1416, 7, Abcd, Kings]
że to, co trzeba?
edit
Zakładając (zgadywania), czego potrzebujesz to uporządkować talię kart, które mają oba numery i "litery" (J, Q, K, A), możesz spróbować użyć niestandardowego komparator.
Oto ten, który bierze pod uwagę numery „jak numery” na resztę jako ciągi, więc „10” pochodzi od „2”, ale przed „Królów”
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]
Jeśli to, co trzeba Chyba to pomoże ci znaleźć resztę. Prawdopodobnie następnym krokiem będzie sortowanie pików w porównaniu z sercami.
Po odpowiedź przez Roman można utworzyć klasę i implementować interfejs Comparable:
class Card implements Comparable<Card> {
public int compareTo(Card other) {
// add custom logic to compare one card with other
}
}
"Wiem, że używam Collections.sort, ale sortuje tylko ciągi zawierające litery" uh? – leonbloy
Nie jesteś pewien, co próbujesz zrobić, sortowanie kolekcji sortuje wszystko (w tym "7") alfabetycznie. Liczby są umieszczane przed A, więc znajdą się na górze. Jeśli chcesz, aby 7 było przechowywane w "s", musisz utworzyć słownik z klasą słownikową, która zawiera ciąg znaków "7", a także kod/tekst "Siedem" lub coś w tym stylu. – Cobusve