Сортировка массива сначала по длине, а затем по алфавиту в 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);
   }
}

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