Сортировать массив сначала по длине, затем по алфавиту в Java - PullRequest
9 голосов
/ 04 августа 2010

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

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

Something1 Something10 Something2 Something3

Тогда как я хочу получить:

Нечто1 Нечто2 Нечто3 Нечто10

Ответы [ 5 ]

24 голосов
/ 04 августа 2010
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());
8 голосов
/ 13 марта 2016

Вот краткое решение 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));
4 голосов
/ 04 августа 2010

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

1 голос
/ 04 августа 2010

Сортировка сначала по длине, а затем по лексическому принципу будет работать ТОЛЬКО, если строковые префиксы (то есть часть перед числом) имеют одинаковую длину во всех случаях. Я полагаю, что вы действительно хотите написать компаратор, который разделяет строковую и числовую части и сортирует их по алфавиту в строке и численно в числовой части.

0 голосов
/ 04 августа 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...