2011-09-27 18 views
16

Deseo pedir un ArrayList de cadenas por longitud, pero no solo por orden numérico.Sort ArrayList de cadenas por longitud

decir, por ejemplo, la lista contiene estas palabras:

cucumber 
aeronomical 
bacon 
tea 
telescopic 
fantasmagorical 

Tienen que ser ordenados por su diferencia en la longitud de una cadena especial, por ejemplo:

intelligent 

Así que la lista final se vería así (diferencia en paréntesis):

aeronomical  (0) 
telescopic  (1) 
fantasmagorical (3) - give priority to positive differences? doesn't really matter 
cucumber  (3) 
bacon   (6) 
tea    (8) 

Respuesta

27

Utilice un comparador personalizado:

public class MyComparator implements java.util.Comparator<String> { 

    private int referenceLength; 

    public MyComparator(String reference) { 
     super(); 
     this.referenceLength = reference.length(); 
    } 

    public int compare(String s1, String s2) { 
     int dist1 = Math.abs(s1.length() - referenceLength); 
     int dist2 = Math.abs(s2.length() - referenceLength); 

     return dist1 - dist2; 
    } 
} 

Luego ordene la lista usando java.util.Collections.sort(List, Comparator).

+0

La prioridad a las diferencias positivas se puede dar multiplicando las diferencias positivas por dos, y las negativas por dos negativas, y agregando una. –

+0

Debes hacer referenceLength final. –

4

Lo haría con la versión de Collections.sort() que toma un Comparator explícito.

+0

@downvoter - ¿Preferiría que yo le diera el cucharón a la respuesta, en lugar de enseñarle al OP dónde encontrar la información? – parsifal

+7

Voto descendente porque ... ¿picazón en el dedo índice? Debe ser un comentario? ¿Enemigo jurado de parsifal? –

+2

Downvoted debido al comentario anterior: D – user1613360

5
This will help you - String in Ascending order 


class StringLengthListSort implements Comparator<String>{ 

    @Override 
    public int compare(String s1, String s2) { 
    return s1.length() - s2.length(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
    List<String> list = new ArrayList<String>(); 
    StringLengthListSort ss = new StringLengthListSort(); 
    list.add("ram"); 
    list.add("rahim"); 
    list.add("ramshyam"); 
    Collections.sort(list, ss); 
    System.out.println(list); 
    } 

} 
5

Si está utilizando Java 8+ puede utilizar una expresión lambda para poner en práctica (@ respuesta de Barend como) el comparador

List<String> strings = Arrays.asList(new String[] {"cucumber","aeronomical","bacon","tea","telescopic","fantasmagorical"}); 
strings.sort((s1, s2) -> Math.abs(s1.length() - "intelligent".length()) - Math.abs(s2.length() - "intelligent".length())); 
+1

La mejor solución para Java 8+. Corto y preciso. –

-1

creo que las soluciones propuestas son ilegales.

El contrato de interfaz Comparator exige que el método de comparación sea coherente con el método equals.

Eso significa que si tiene x.compareTo(y) == 0 entonces debe tener x.equals(y) == true.

Por lo tanto, quizás las soluciones funcionen en la práctica, pero no están garantizadas y pueden fallar en la próxima versión.

+1

Si ese fuera el caso, no podría hacer * cualquier * comparadores de cadenas personalizados. – Clashsoft

Cuestiones relacionadas