2010-06-08 24 views
6

Estoy tratando de ordenar un ArrayList de cadenas que representan valores de tarjeta. Por lo tanto, algunas cartas contienen letras ("Rey") y algunas contienen cadenas que contienen solo un número ("7"). Sé usar Collections.sort, pero solo ordena cadenas que contienen letras. ¿Cómo puedo ordenar ArrayList por número y orden alfabético?¿Cómo puedo ordenar un ArrayList lexicográficamente?

Editar: Lo siento, no debí prestar mucha atención cuando miré la clasificación. El tipo funciona correctamente, hay que acaban de ser arrojado fuera por el hecho de que un 10 vendrá antes de que un 2. Gracias

+1

"Sé usar Collections.sort, pero solo ordena cadenas que contienen letras" ¿eh? – leonbloy

+1

No estoy seguro de lo que está tratando de hacer, clasificando la colección ordenará todo (incluido "7") alfabéticamente. Los números se colocan antes que A, para que terminen en la parte superior. Si desea almacenar 7 en "s", debería crear un diccionario con algo así como la clase de diccionario Colecciones genéricas, que tiene la cadena de visualización "7", así como la representación de código/texto "Siete", o algo como eso. – Cobusve

Respuesta

9

No, Collections.sort va a clasificar todo, mediante una comparación ordinal lexicográfico Unicode ya que es el comportamiento de String.compareTo. "7" vendrá antes que "King", y "10" vendrá antes de "2".

+0

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

0

Sé usar Collections.sort, pero solo ordena las cadenas que contienen letras. ¿Cómo puedo ordenar ArrayList por número y orden alfabético?

Si la cadena es un número que ya está siendo ordenadas (como una cadena, aunque) mira:

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

imprime

$ java Sort 
[3.1416, 7, Abcd, Kings] 

es eso lo que necesita?

edición

Suponiendo (adivinar) lo que necesita es ordenar una baraja de cartas, que tienen ambos números y "letras" (J, Q, K, A) se puede tratar de utilizar una costumbre comparador.

Aquí hay una que tiene en cuenta los números "como números" el resto en forma de cadenas, por lo que "10" que viene después de "2", pero antes de "Reyes"

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] 

Si eso es lo que necesita supongo esto te ayudaría a descubrir el resto. Probablemente la siguiente cosa sea cómo clasificar espadas vs. corazones.

Tras la respuesta por Roman se podría crear una clase e implementar la interfaz Comparable:

class Card implements Comparable<Card> { 
     public int compareTo(Card other) { 
      // add custom logic to compare one card with other 
     } 
    } 
+0

No es lo que está preguntando. Creo que quiere que escribas comparador personalizado para todos los nombres de las tarjetas. –

+0

@Nikita: Entiendo que él "piensa" que los números no están incluidos en el género. Probablemente, el PO necesita alguna aclaración. – OscarRyz

0

Ordenar clasificará todo de acuerdo a su juego de caracteres. En otras palabras, todos los números vendrán antes que las letras en el orden lexicográfico. Por ejemplo, los números decimales comienzan con un '.' y fuera de orden lexicográficamente.

Si quiere cambiar esto, haga del objeto Comparador. Luego puede poner los artículos en el orden que desee.

Por ejemplo, esto va a ordenar los números en orden numérico, y también las palabras en orden léxico:

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 no probado!

1

Como dijo @Jon Skeet, la clasificación incorporada se comparará en función de los valores Unicode. Tendría que escribir su propio método de clasificación.

Sin embargo, siempre que escriba su propio código, ¿podría sugerir una enumeración? Una baraja de cartas es uno de los ejemplos canónicos para el uso de enumeraciones. La versión corta es que puedes declarar tu propio orden para un grupo de cosas; incluso podrías hacer que el rey de espadas superara al rey de diamantes, si así lo deseas. Consulte el tutorial de Sun here.

4

Según tengo entendido, tiene una matriz como ["7", "Queen", "9", "6"] y desea que se vea como ["Queen", "9", "7", "6"] (o en orden inverso) después de realizar la clasificación.

que recomiendo para que sea un poco más orientado a objetos es decir, crear la tarjeta de la clase con el nombre y el valor de los campos:

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

y después de eso crear instancias de esta manera:

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

Después de eso, será mucho más fácil realizar todas las operaciones con tarjetas (y ordenarlas en particular) usando el campo value en lugar de los nombres de las tarjetas.

+1

'' Como una convención, las cartas generalmente también tienen "trajes". '' – fmark

Cuestiones relacionadas