Как я могу отсортировать массив сначала по длине затем в алфавитном порядке?
У меня есть список вещей с числами на них, и я в настоящее время добираюсь:
Something1 Something10 Something2 Something3
Принимая во внимание, что я хочу добраться:
Something1 Something2 Something3 Something10
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());
Создайте компаратор, который сначала сравнивает по длине и, если длины одинаковы, использует String.compareTo ().
Сортировка сначала по длине, а затем лексически будет работать ТОЛЬКО, если префиксы строки (т.е. часть перед числом ) имеет одинаковую длину во всех случаях. Я считаю, что вы действительно можете захотеть написать компаратор, который разделяет строковую и числовую части и сортирует в алфавитном порядке по строке и численно по числовой части.
Определите класс, в котором будет храниться ваш элемент. Похоже, вы хотите, чтобы это была строка.
Для этого класса вам необходимо определить интерфейс Comparable и поместить логику для сравнения в его абстрактный метод.
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); } }
Заявление об отказе от ответственности, я на самом деле не тестировал этот код, но он должен быть близок к тому, что вы хотите.