2010-06-08 18 views
6

Próbuję posortować ArrayList of Strings, które reprezentują wartości kart. Niektóre karty zawierają litery ("King"), a niektóre zawierają ciągi zawierające tylko liczbę ("7"). Wiem, aby korzystać z Collections.sort, ale sortuje tylko ciągi zawierające litery. Jak mogę posortować listę ArrayList według numerów, a także alfabetycznie?Jak sortować leksykograficznie ArrayList?

Edycja: Przepraszam, nie zwracałem zbytniej uwagi, gdy patrzyłem na sortowanie. Rodzaj działa poprawnie, to musi właśnie zostały wyrzucone przez fakt, że przyjdzie przed 10 A 2. Dzięki

+1

"Wiem, że używam Collections.sort, ale sortuje tylko ciągi zawierające litery" uh? – leonbloy

+1

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

Odpowiedz

9

Nie, Collections.sort będzie uporządkować wszystko, używając porządkowej leksykograficzny porównania Unicode jak to zachowanie String.compareTo. "7" pojawi się przed "Królem", a "10" pojawi się przed "2".

+0

yep - http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String) – leonbloy

0

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 
     } 
    } 
+0

Nie o to pyta. Myślę, że chce, żebyś napisał niestandardowy komparator dla wszystkich nazw kart. –

+0

@Nikita: Rozumiem, że on "myśli" liczby nie są w tym rodzaju. Prawdopodobnie PO wymaga pewnych wyjaśnień. – OscarRyz

0

Sortuj sortuje wszystko w zależności od zestawu znaków. Innymi słowy, wszystkie liczby pojawią się przed literami w kolejności leksykograficznej. Na przykład liczby dziesiętne zaczynają się od "." i w porządku leksykograficznym.

Jeśli chcesz to zmienić, ustaw obiekt Komparator. Możesz wtedy umieścić elementy w dowolnej kolejności.

Na przykład ten będzie sortować numery w kolejności numerycznej, a także słowa w porządku leksykalnym:

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 nie testowane!

1

Jak powiedział @ Jon Skeet, wbudowany sort będzie porównywać na podstawie wartości Unicode. Musisz napisać własną metodę sortowania.

Dopóki jednak piszesz własny kod, czy mogę zaproponować wyliczenie? Talia kart jest jednym z kanonicznych przykładów użycia wyrażeń. Krótka wersja jest taka, że ​​możesz zadeklarować własną kolejność sortowania dla grupy rzeczy; mógłbyś nawet sprawić, by król pików wyprzedził króla diamentów, gdybyś chciał. Sprawdź samouczek Sun here.

4

Jak rozumiem, masz tablicę taką jak ["7", "Queen", "9", "6"] i chcesz, aby wyglądała jak ["Queen", "9", "7", "6"] (lub w odwrotnej kolejności) po zakończeniu sortowania.

polecam zrobić to trochę bardziej zorientowany obiektowo czyli tworzyć klasy karty z nazwy pola i wartości:

class Card { 
    private final String name; 
    private final int value; 
    ... 
    //constructor and getters 
} 

a potem utworzyć instancji w ten sposób:

Card six = new Card("6", 6); 
Card ten = new Card("10", 10); 
Card queen = new Card("Queen", 12); 

Po tym znacznie łatwiej będzie wykonać wszystkie operacje za pomocą kart (i szczególnie sortowania), używając zamiast nich nazw pól value.

+1

'' Jako konwencja, karty zazwyczaj mają również "kolory". '' – fmark