2010-08-04 5 views
9

Как я могу отсортировать массив по длине, а затем в алфавитном порядке?Сортировка массива сначала по длине, затем по алфавиту в Java

У меня есть список вещей, с номерами на них, и я в настоящее время получаю:

Something1 Something10 Something2 Something3

В то время как я хочу получить:

Something1 Something2 Something3 Something10

+1

любым шансом, домашнее задание? –

+0

Нет, просто есть тонна файлов, которые я хотел бы переименовать очень быстро. Они пронумерованы, но числа нужно немного сдвинуть, а остальная часть имени файла изменилась. Но естественное упорядочение операционной системой обычно возвращает 1 10 11 12 13 14 15 16 17 18 19 2 20 и т. Д. – Brian

+1

Вы пробовали использовать только нулевые цифры в своих номерах? IE, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11. –

ответ

24
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()); 
+0

Для сравнения требуется int compareTo (Obj o), а не сравнение (Object o1, Object o2). Однако этот код близок. – Starkey

+3

@Starkey: Это сравнимо. Это компаратор. Вы были близки, хотя. –

+0

Спасибо, мне просто нужно было отсортировать имена файлов, в которых номера были в них очень быстро, и переименовать их. У меня были они в массиве, поэтому мне пришлось преобразовать его в коллекцию, но это сработало для моей цели. Благодаря! – Brian

4

Создайте компаратор, который сначала сравнивает по длине, и если длины одинаковы, используется String.compareTo ().

+0

Также обратите внимание на существование 'compareToIgnoreCase()'. –

1

Сортировка сначала по длине, а затем лексически будет работать только если строка префиксов (т.е. часть перед номером) имеет ту же длину во всех случаях. Я считаю, что вы действительно можете написать компаратор, который разделяет строку и числовые части и сортирует по алфавиту в строке и численно на части числа.

0

Определите класс для хранения вашего предмета. Похоже, вы хотите, чтобы это была строка.

Для этого класса вам необходимо определить интерфейс 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); 
    } 
} 

Отказ от ответственности, я фактически не проверить этот код, но он должен быть близок к тому, что вы хотите.

7

Вот краткое 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)); 
Смежные вопросы