Сортировка ArrayList строк по длине
Я хочу заказать 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)
Ответы
Ответ 1
Используйте собственный компаратор:
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)
.
Ответ 2
Если вы используете Java 8+, вы можете использовать выражение lambda для реализации (@Barend 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()));
Ответ 3
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);
}
}
Ответ 4
Вы сделали бы это с версией Collections.sort(), которая принимает явный Comparator.
Ответ 5
Использование собственного компаратора является правильным. Это один из способов реализовать это:
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;
Ответ 6
Если вы используете Java 8, вы также можете попробовать использовать эту лямбду
packages.sort(Comparator.comparingInt(String::length));
Ответ 7
просто с решением Java8 только со ссылкой на Comparator и Method:
Stream.of (список).flatMap(Collection :: stream).sorted(Comparator.comparing(String :: length)). Collect (toList());
Ответ 8
Я думаю, что предлагаемые решения являются незаконными.
Контракт интерфейса Comparator требует, чтобы метод сравнения был совместим с методом equals.
Это означает, что если у вас есть x.compareTo(y) == 0
, то вы должны иметь x.equals(y) == true
.
Итак, возможно, решения работают на практике, но они не гарантированы и могут быть нарушены в следующей версии.