web-dev-qa-db-fra.com

Sort ArrayList des chaînes par longueur

Je souhaite commander une liste de chaînes ArrayList par longueur, mais pas uniquement par ordre numérique.

Disons par exemple, la liste contient ces mots:

cucumber
aeronomical
bacon
tea
telescopic
fantasmagorical

Ils doivent être classés en fonction de leur différence de longueur en une chaîne spéciale, par exemple:

intelligent

La liste finale ressemblerait donc à ceci (différence entre parenthèses):

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

Utilisez un comparateur personnalisé:

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

Ensuite, triez la liste en utilisant Java.util.Collections.sort(List, Comparator).

29
Barend

Si vous utilisez Java 8+, vous pouvez utiliser une expression lambda pour implémenter le comparateur

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()));
8
Josh Johnson
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);
    }

}

Vous feriez cela avec la version de Collections.sort () qui prend un comparateur explicite.

3
parsifal

Si vous utilisez Java 8, vous pouvez également essayer d’utiliser ce lambda.

packages.sort(Comparator.comparingInt(String::length));
0
SamzSakerz

L'utilisation d'un comparateur personnalisé est correcte. C'est une façon de le mettre en œuvre:

    Comparator c = new Comparator<String>()
    {
        public int compare(String s1, String s2) {
            return Integer.compare(s1.length(), s2.length());
        }
    };
    Collections.sort(results, c);
    return results;
0
Chris Mart