2011-09-27 12 views
16

Desidero ordinare un array di stringhe per lunghezza, ma non solo in ordine numerico.Sort ArrayElenco di stringhe per lunghezza

diciamo per esempio, l'elenco contiene queste parole:

cucumber 
aeronomical 
bacon 
tea 
telescopic 
fantasmagorical 

Hanno bisogno di essere ordinato da loro differenza in lunghezza per una stringa speciale, ad esempio:

intelligent 

Così la lista definitiva sarebbe simile a questa (differenza tra parentesi):

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

risposta

27

Utilizzare un comparatore personalizzato:

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

Quindi ordinare l'elenco utilizzando java.util.Collections.sort(List, Comparator).

+0

La priorità alle differenze positive può essere data moltiplicando le differenze positive per due e le differenze negative per due negative, quindi aggiungendo una. –

+0

Si dovrebbe rendere referenceLength finale. –

4

Si farebbe questo con la versione di Collections.sort() che prende un esplicito Comparator.

+0

@downvoter - preferiresti che avessi falsificato la risposta, piuttosto che insegnare all'OP dove trovare le informazioni? – parsifal

+7

Downvoted perché ... prurito dito downvote? Dovrebbe essere un commento? Nemico giurato di parsifal? –

+2

Downvoted a causa del commento sopra: 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

Se stai usando Java 8+ è possibile utilizzare un'espressione lambda per implementare (@ risposta di Barend come) il comparatore

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 migliore soluzione per Java 8+. Breve e preciso. –

-1

penso che le soluzioni proposte sono illegali.

Il contratto di interfaccia del comparatore richiede che il metodo di confronto sia coerente con il metodo di uguale.

Ciò significa che se si dispone di x.compareTo(y) == 0, è necessario disporre di x.equals(y) == true.

Quindi, forse le soluzioni funzionano in pratica, ma non sono garantite e potrebbero rompersi nella prossima versione.

+1

In tal caso, non è possibile effettuare * qualsiasi * Comparatore di stringhe personalizzato. – Clashsoft

Problemi correlati