2012-08-03 24 views

Respuesta

27

puede escribir su propio comparador

public class ExampleComparator implements Comparator<String> { 
    public int compare(String obj1, String obj2) { 
    if (obj1 == null) { 
     return -1; 
    } 
    if (obj2 == null) { 
     return 1; 
    } 
    if (obj1.equals(obj2)) { 
     return 0; 
    } 
    return obj1.compareTo(obj2); 
    } 
} 
+0

+1 para los implementos Comparador –

+8

'Comparador' es un tipo genérico, por lo que' ExampleComparator' probablemente debería implementar 'Comparador ' para evitar advertencias. – theisenp

+0

Para el comparador de cuerdas, tenga en cuenta la cadena en minúsculas (o mayúsculas) antes de compararlas; de lo contrario, debería obtener esta orden A-Za-z –

10

Este es un genérico Comparator para cualquier tipo de Comparable objeto, no sólo String:

package util; 

import java.util.Comparator; 

/** 
* The Default Comparator for classes implementing Comparable. 
* 
* @param <E> the type of the comparable objects. 
* 
* @author Michael Belivanakis (michael.gr) 
*/ 
public final class DefaultComparator<E extends Comparable<E>> implements Comparator<E> 
{ 
    @SuppressWarnings("rawtypes") 
    private static final DefaultComparator<?> INSTANCE = new DefaultComparator(); 

    /** 
    * Get an instance of DefaultComparator for any type of Comparable. 
    * 
    * @param <T> the type of Comparable of interest. 
    * 
    * @return an instance of DefaultComparator for comparing instances of the requested type. 
    */ 
    public static <T extends Comparable<T>> Comparator<T> getInstance() 
    { 
     @SuppressWarnings("unchecked") 
     Comparator<T> result = (Comparator<T>)INSTANCE; 
     return result; 
    } 

    private DefaultComparator() 
    { 
    } 

    @Override 
    public int compare(E o1, E o2) 
    { 
     if(o1 == o2) 
      return 0; 
     if(o1 == null) 
      return 1; 
     if(o2 == null) 
      return -1; 
     return o1.compareTo(o2); 
    } 
} 

Cómo utilizar con String:

Comparator<String> stringComparator = DefaultComparator.getInstance(); 
+1

Lo siento, leí mal el encabezado. Leí el paquete java.util! – Sharcoux

+0

@Sharcoux ¡Ya veo! C -: = –

+0

Podría ser agradable para añadir el siguiente código a la clase: public static > Comparador getReversedInstance() { retorno Collections.reverseOrder ((Comparador ) getInstance()); } –

6

También, si quieres comparación entre mayúsculas y minúsculas, en versiones recientes de Java, la clase String contiene un campo public static final llamado CASE_INSENSITIVE_ORDER que es del tipo Comparator<String>, como acabo de descubrir recientemente. Por lo tanto, puede hacer su trabajo usando String.CASE_INSENSITIVE_ORDER.

+0

Esta es la respuesta correcta. – tallseth

+0

@tallseth esta es la respuesta correcta ** solo ** si está interesado en la búsqueda de mayúsculas y minúsculas, ** y ** está utilizando una versión reciente de java. Si lo que necesita es una búsqueda que distinga entre mayúsculas y minúsculas o si tiene alguna versión anterior de java, esta no es la respuesta correcta para usted. –

9

De nuevo, no necesita el comparador para Arrays.binarySearch(Object[] a, Object key), siempre y cuando los tipos de objetos sean comparables, pero con las expresiones lambda esto es mucho más fácil.

Sólo tiene que sustituir el comparador con la referencia al método: String::compareTo

Ej:

Arrays.binarySearch(someStringArray, "The String to find.", String::compareTo); 

También es posible usar

Arrays.binarySearch(someStringArray, "The String to find.", (a,b) -> a.compareTo(b)); 

pero incluso antes de lambdas, siempre hubo clases anónimas:

Arrays.binarySearch(
       someStringArray, 
       "The String to find.", 
       new Comparator<String>() { 
        @Override 
        public int compare(String o1, String o2) { 
         return o1.compareTo(o2); 
        } 
       }); 
2

Podemos usar el comparador String.CASE_INSENSITIVE_ORDER para comparar las cadenas en caso de que el orden no sea sensible.

Arrays.binarySearch(someStringArray, "The String to find.",String.CASE_INSENSITIVE_ORDER); 
15

Solución para Java basado en 8 java.util.Comparator.comparing(...):

Comparator<String> c = Comparator.comparing(String::toString); 

o

Comparator<String> c = Comparator.comparing((String x) -> x); 
+0

O Comparator.comparing (Function.identity()) – ailveen

-1

Respecto de answer había un error Nambari.Si se comparan los valores utilizando el doble signo igual programa == nunca alcanzarán método de comparación, a menos que alguien va a utilizar nueva palabra clave para crear el objeto de cadena que no es la mejor práctica. Esta podría ser una solución un poco mejor:

public int compare(String o1, String o2) { 
     if (o1 == null && o2 == null){return 0;} 
     if (o1 == null) { return -1;} 
     if (o2 == null) { return 1;} 
     return o1.compareTo(o2); 
    } 

P.S. Gracias por los comentarios;)

+1

Debe explicar un poco la respuesta. http://stackoverflow.com/help/how-to-answer –

+1

Aunque este código puede responder a la pregunta, proporcionando contexto adicional con respecto a _why_ y/o _how_ responde la pregunta mejoraría significativamente su valor a largo plazo . Por favor [edite] su respuesta para agregar alguna explicación. –

+1

¿En qué se diferencia esto de la [respuesta] de Nambari (http://stackoverflow.com/a/11804763/369450)? – cpburnz

0

generalizar el buena respuesta de Mike Nakis con String.CASE_INSENSITIVE_ORDER, también se puede utilizar:

Collator.getInstance(); 

Ver Collator

4

Muy bien, este es un par de años más tarde, pero con Java 8 se puede utilizar Comparator.naturalOrder():

http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#naturalOrder--

De javadoc:

static <T extends Comparable<? super T>> Comparator<T> naturalOrder() 

Devuelve un comparador que compara objetos comparables en el orden natural. El comparador devuelto es serializable y arroja NullPointerException al comparar null.

+0

Los enlaces a posibles respuestas siempre son bienvenidos, pero por favor agregue las partes más importantes aquí en caso de que el enlace se elimine. –

Cuestiones relacionadas