Сортировка массива сначала по длине, а затем по алфавиту в Java
Как я могу сортировать массив сначала по длине, а затем по алфавиту?
У меня есть список вещей с номерами на них, и в настоящее время я получаю:
Something1 Что-то Something2 Что-то!--1-->
тогда как я хочу получить:
Something1 Something2 Something3 Something10
5 ответов
public class MyComparator implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
if (o1.length() > o2.length()) {
return 1;
} else if (o1.length() < o2.length()) {
return -1;
}
return o1.compareTo(o2);
}
}
затем использовать:
Collections.sort(yourList, new MyComparator());
вот краткое решение Java 8:
List<String> list = Arrays.asList("Something1", "Something10", "Something2", "Something3");
list.sort(Comparator.comparing(String::length).thenComparing(String::compareTo));
или без учета регистра версия:
list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase));
создайте компаратор, который сначала сравнивает по длине, и если длины одинаковы, использует строку.метод compareto().
сортировка сначала по длине, а затем лексически будет работать только в том случае, если строковые префиксы (т. е. часть перед числом) имеют одинаковую длину во всех случаях. Я считаю, что вы действительно можете написать компаратор, который разделяет строковые и числовые части и сортирует в алфавитном порядке по строке и числовой части.
определите класс для хранения вашего элемента. Похоже, вы хотите быть строкой.
для этого класса вам нужно определить сопоставимый интерфейс и поместить логику для сравнения в его абстрактный метод.
int compareTo(T o)
например:
class MyString extends String { @Override int compareTo(Object obj) { // put your logic in here. // Return -1 if this is "less than" obj. // Return 0 if this is equal to obj // Return 1 if this is "greater than" obj. // Test length first if (length() < obj.length()) return -1; if (length() > obj.length()) return 1; // Lengths are the same, use the alphabetical compare defined by String already return super.compareTo(obj); } }
отказ от ответственности, я на самом деле не тестировал этот код, но он должен быть близок к тому, что вы хотите.