2013-03-06 3 views
7

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

Скажем, что каждый объект имеет имя и поле с номерами.

Как

Bob 1 
Bob 2 
Jack 1 
Jack 2 

Можно без создания нового компаратора?

ответ

7

Да, вы можете выполнить свой вид, не создавая новый c omparator.

Существует well-known trick для сортировки по первичному полю, вторичному, третичному и т. Д.: Сначала сортируйте по наименее важному полю (третичному), затем следующему важному полю (вторичному) и, наконец, самому важному полю (первичному) , Но алгоритм сортировки должен быть стабильный, чтобы это сработало.

Если вы сортируете массив, используйте Arrays.sort(). Если вы сортируете List, используйте Collections.sort(). Оба этих метода гарантируют стабильность.

Предположим, что ваш основной объект компаратора хранится в переменной primaryComp, а ваш вторичный - в secondaryComp. Тогда вот какой код нужно выполнить:

Arrays.sort(mylist, secondaryComp); // This must come first! 
Arrays.sort(mylist, primaryComp); 
+0

Nice. Я не знал об этом трюке! – Jack

-1

Сначала сравнить второй компаратор, а затем первый компаратор. Я считаю, что это должно сделать трюк. Вы можете создать класс для этого.

class FullName { 
    public String firstName; 
    public String secondName; 
} 

Say создать новое имя, называемое BobBobbins, присваивать значения, а затем просто сравните второе имя первого, а затем первое имя. Вы можете иметь статическую функцию, чтобы сделать то сравнения:

public static bool compareTo (FullName name1, FullName name2) { 
    // Algorithm here 
} 

Если вы используете статический компаратор, вы можете придется это сделать: FullName.compareTo(BobBobbins, CharlieChaplin);

6

предполагается, что ваш класс является

class X { 
    String name; 
    int num; 
} 

затем сортировка будет

Arrays.sort(x, new Comparator<X>() { 
     @Override 
     public int compare(X o1, X o2) { 
      if (o1.name.equals(o2.name)) { 
       return Integer.compare(o1.num, o2.num); 
      } 
      return o1.name.compareTo(o2.name); 
     }}); 
Смежные вопросы