2011-12-26 8 views
7

Al intentar ordenar una matriz en función de las longitudes de cadena de sus elementos, me aparece un error de compilación. Tengo un juego para empezar,,ordenando longitudes de cadena utilizando el comparador

Set<String> arraycat = new HashSet<String>(); 
//add contents to arraycat 
String[] array = arraycat.toArray(new String[0]); 
//array looks like this now: 
//array=[cat,cataaaa,cataa,cata,cataaa] 

que lo ideal sería que desee ordenados a

array=[cat,cata,cataa,cataaa,cataaaa] 

así que tengo un comparador de tipo

class comp implements Comparator { 

    public int compare(String o1, String o2) { 
     if (o1.length() > o2.length()) { 
      return 1; 
     } else if (o1.length() < o2.length()) { 
      return -1; 
     } else { 
      return 0; 
     } 
    } 
} 

y luego llamo a la clase por

Collections.sort(array, new comp()); 

pero luego, es thr me permite dos errores de compilación:

comp is not abstract and does not override abstract method compare(java.lang.Object,java.lang.Object) in java.util.Comparator 
class comp implements Comparator { 
^ 
testa.java:59: cannot find symbol 
symbol : method sort(java.lang.String[],comp) 
location: class java.util.Collections 
Collections.sort(array, new comp()); 
^2 errors 

Agradeceré cualquier pista para resolver el problema.

Respuesta

13

Es necesario especificar un parámetro de tipo para Comparator para su implementación para trabajar.

class comp implements Comparator<String> { 
    public int compare(String o1, String o2) { 
    if (o1.length() > o2.length()) { 
     return 1; 
    } else if (o1.length() < o2.length()) { 
     return -1; 
    } else { 
     return 0; 
    } 
    } 
} 

En Java 1.7 y posterior, también puede simplificar el cuerpo de este método para:

class comp implements Comparator<String> { 
    public int compare(String o1, String o2) { 
    return Integer.compare(o1.length(), o2.length()); 
    } 
} 

También, Collections.sort ordena List objetos. Puesto que usted está ordenar una matriz, se debe utilizar Arrays.sort:

Arrays.sort(array, new comp()); 
+0

Hola Lawrence ... gracias por esto .. Eso ha resuelto el primer error de compilación: pero, todavía tengo otro error de compilación que dice: "no se puede encontrar el símbolo símbolo: method sort (java.lang.String [], comp) ubicación: clase java.util.Collections \t \t Collections.sort (array, new comp()); "He importado el paquete util *, no estoy seguro de por qué recibo este error – JohnJ

+1

[' sort() '] (http://docs.oracle.com/javase/6/ docs/api/java/util/Collections.html # sort (java.util.List)) toma una 'Lista', no una matriz 'String []'. Use ['Arrays.asList()'] (http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T ...)) para convertirlo. –

+0

Además, para un comparador más simple, considere usar ['Integer.signum (int) '] (http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#signum (int)) en lugar de' if/else-if/else'; por ejemplo, 'return Integer.signum (o1.length() - o2.length());' –

2

En caso de ser

class comp implements Comparator<String> { ... 

o incluso mejor

Collections.sort(array, new Comparator<String> { ... 

(y ni siquiera el nombre de la clase que sólo se utiliza una vez)

+0

Lo siento, pero ¿no es eso lo que tengo en el código? – JohnJ

+0

¡Debe especificar la variable de tipo! Comparador * * – Malvolio

6

Es necesario utilizar Arrays.sort() método si la fuente de datos es un array.

Por ejemplo,

String []array={"first","second","third","six"}; 

Arrays.sort(array,new Comparator<String>() 
{ 
    public int compare(String s1,String s2) 
    { 
    return s1.length() - s2.length(); 
    } 
}); 

O convertir matriz a la lista para usar Collections.sort método(),

Collections.sort(Arrays.asList(array),new Comparator<String>() 
{ 
    public int compare(String s1,String s2) 
    { 
    return s1.length() - s2.length(); 
    } 
}); 
0

que tenían una asignación similares recientemente y yo le proporcionaremos con un adicional ejemplo.

import java.util.Arrays; 
import java.util.Comparator; 
//for more information: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html 

/** 
* 
* @author Xilef 
*/ 
public class StringKorter implements Comparator<String> { 
    @Override 
    public int compare(String s1, String s2){ 
     if (s1.length() > s2.length()) 
     return 1; 
     else if (s1.length() < s2.length()) 
     return -1; 
     else return 0; 
    } 
    public static void main(String[] args) { 
     String[] woorden = { "boot", "kinderen", "stoel", "volwassenen", "ei", "stoel", "kop", "zeshoek", "stoel", "ei" }; 
     System.out.println("woorden: " + Arrays.toString(woorden));//before sorting by length 
     Arrays.sort(woorden, new StringKorter()); 
     System.out.println("Array woorden after sorting by length: " + Arrays.toString(woorden)); 
    } 
}