Как сравнить String по их длине в Java 7 и Java 8?
Привычным способом Java сравнения строк является лексикографический способ, реализованный в методе compareTo() класса String. Но иногда нужно сравнить строки по их длине. По умолчанию нельзя использовать для этого метод compareTo(). Вместо этого нужно написать собственный метод, который вычисляет длину строк с помощью метода length() и сравнивает их. Такой метод должен возвращать положительное значение, если первая String имеет длину больше второй; отрицательное значение, если длина первой String меньше длины второй и ноль, если обе String имеют одинаковую длину.
Можно определить такой одноразовый метод, используя анонимный внутренний класс, и далее использовать его для сортировки списка строк по длине. Это метод хорошо работает в Java 6 и 7, но в Java 8 он работает еще лучше из-за меньшего количества помех благодаря новой функции, называемой лямбда-выражения.
Вот как можно сделать это в более ранних версиях Java:
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
Сравнение длины строк arraylist в Java 8 можно сделать еще проще, используя лямбда-выражение и новые методы по умолчанию, добавленные в класс java.util.Comparator:
Comparator<String> strlenComp = (a, b) -> Integer.compare(a.length(), b.length());
a и b - это два объекта String. Integer.compare() - это новый метод, добавленный в Java 8. Поскольку мы используем компаратор для строк, компилятор в состоянии выводить типы a и b, которые являются String.
Как отсортировать список строк по их длине в Java 7 и 8
Ниже приведен пример использования этого компаратора длины строк для сортировки списка строк по их длине. В этом примере мы продемонстрировали программы на JDK 6 и 7 с использованием анонимного класса, и новый способ с использованием лямбда-выражений, который доступен в Java 8. Он занимает всего одну строку и его намного проще понять, если вы знакомы с синтаксисом лямбда-выражений.
Как отсортировать список строк по их длине в Java 7 и 8
Java 6, 7
Import java.util.ArrayList;
Import java.util.Arrays;
Import java.util.Collections;
Import java.util.Comparator;
Import java.util.List;
/ *
* Программа Java для сортировки списка строк по их длине
* /
public class StringComparisonByLength{
Public static void main (String [] args) {
List<String> books = new ArrayList<>(Arrays.asList("Effective Java", "Algorithms", "Refactoring" ));
System.out.println("Sorting List of String by length in JDK 7 ======");
System.out.println("The original list without sorting");
System.out.println(books);
Comparator<String> byLength = new Comparator<String>(){
@Override
Public int compare (String s1, String s2) {
Return s1.length () - s2.length ();
}
};
Collections.sort(books, byLength);
System.out.println("The same list after sorting string by length");
System.out.println(books);
}
}
Результат
Sorting List of String by length in JDK 7 ======
The original list without sorting [Effective Java, Algorithms, Refactoring]
The same list after sorting string by length
[Algorithms, Refactoring, Effective Java]
Java 8
Import java.util.ArrayList;
Import java.util.Arrays;
Import java.util.Comparator;
Import java.util.List;
/ *
* Программа Java для сортировки списка строк по их длине в JDK 8
* /
public class SortingListOfStringByLength{
public static void main(String[] args) {
// В Java 8
System.out.println("Sorting List of String by length in Java 8 ======");
List<String> cities = new ArrayList<>(Arrays.asList("London", "Tokyo", "NewYork"));
System.out.println("The original list without sorting");
System.out.println(cities);
cities.sort((first, second) -> Integer.compare(first.length(), second.length()));
System.out.println("The same list after sorting string by length");
System.out.println(cities);
}
}
Результат
Sorting List of String by length in Java 8 ======
The original list without sorting
[London, Tokyo, NewYork]
The same list after sorting string by length
[Tokyo, London, NewYork]
Это все, что касается сравнения длины строк Java и сортировки списка String по длине в Java 7 и Java 8. В последней версии языка делать это намного удобнее, поскольку можно создать пользовательский компаратор только одной строкой, используя лямбда-выражение. API JDK 8 содержит множество подобных методов, которые облегчают еще более сложные сравнения. Например, используя метод thenComparing(), можно связать несколько компараторов.