Сортировать ArrayList строк по длине - PullRequest
19 голосов
/ 28 сентября 2011

Я хочу заказать ArrayList строк по длине, а не только в числовом порядке.

Скажем, например, список содержит следующие слова:

cucumber
aeronomical
bacon
tea
telescopic
fantasmagorical

Их нужно упорядочить по разнице в длине в специальной строке, например:

intelligent

Итак, окончательный список будет выглядеть так (разница в скобках):

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

Ответы [ 7 ]

29 голосов
/ 28 сентября 2011

Используйте пользовательский компаратор:

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

Затем отсортируйте список, используя java.util.Collections.sort(List, Comparator).

9 голосов
/ 01 августа 2014

Если вы используете Java 8+, вы можете использовать лямбда-выражение для реализации (@ Barend's answer as) компаратора

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()));
5 голосов
/ 06 августа 2013
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);
    }

}
3 голосов
/ 28 сентября 2011

Это можно сделать с версией Collections.sort () , которая принимает явный Comparator .

1 голос
/ 28 августа 2018

Использование собственного компаратора является правильным. Это один из способов его реализации:

    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 голосов
/ 21 сентября 2018

Если вы используете Java 8, вы также можете попробовать использовать эту лямбду

packages.sort(Comparator.comparingInt(String::length));
0 голосов
/ 14 октября 2015

Я думаю, что предложенные решения недопустимы.

Контракт интерфейса Comparator требует, чтобы метод сравнения соответствовал методу equals.

Это означает, что если у вас есть x.compareTo(y) == 0, то вы должныиметь x.equals(y) == true.

Итак, возможно, решения работают на практике, но они не гарантированы и могут сломаться в следующем выпуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...