2015-10-08 2 views
2

Как создать 2 разных компаратора для сортировки 2 ArrayLists? Первый список сначала сортируется по номеру строки, затем номеру столбца.Создание четырех разных компараторов

[(0,1,A), (1,1,A), (1,2,A), (2,1,A)] // Longest sequence of row-adjacent elements has size 2 

Второй список сортируется по первому номеру столбца, затем номер строки.

[(0,1,A), (1,1,A), (2,1,A), (1,2,A)] // Longest sequence appears as adjacent elements, size 3 

У меня ArrayList<RowColElem<T>> rowElems, который должен сортировать по количеству строк первой затем номер столбца; и ArrayList<RowColElem<T>> colElems, который должен сначала отсортировать по номеру столбца, затем номер строки. ПРИМЕЧАНИЕ. Оба arraylists содержат одни и те же элементы, но в несортированном порядке (то есть, чтобы они были добавлены), и я должен их сортировать, но не знаю, как реализовать 2 компаратора. Как мне создать 2 компаратора?

public class Board{ 
    .............. 
.................. 
ArrayList<<T>> rowsElems; //Already contains information 
ArrayList<<T>> colsElems; //Already contains information 

public List<m<T>> ColOrder(){ 
     //needs to sort rowElems 
    } 

    public List<<T>> elementsInColRowOrder(){ 
     //needs to sort colElems 
    } 

} 
+0

Вы пытались [написать «Компаратор»] (https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html) и использовать 'Collections.sort' для сортировки списков уже? –

+0

Моя проблема в том, что если я хочу сделать сортировку более 2 раз? Должен ли я создать 4 разных класса Comparator? –

+0

Что вы имеете в виду, сортируя более 2 раз? Для достижения заказа «номер строки сначала, а затем номер столбца» вам нужен только один _sort_, но с помощью «Comparator», который сначала сравнивает значения 'getRow()' для разных 'RowColElem' и только если строки равны, сравниваются значения 'getCol()' этих элементов. Компаратор 'SENIORITY_ORDER' в связанном учебнике является примером, где два свойства сравниваемых объектов используются для определения порядка. –

ответ

0

Первый компаратор:

public class CompareRowCol<T> implements Comparator<RowColElem<T>> { 
    public int compare(RowColElem<T> o1, RowColElem<T> o2) { 
     int cmp = Integer.compare(o1.getRow(),o2.getRow()); 
     if(cmp != 0) { 
      return cmp; 
     } else { 
      return Integer.compare(o1.getCol(),o2.getCol()); 
     } 
    } 
} 

Для второго вы просто обменять getRow с getCol:

public class CompareColRow<T> implements Comparator<RowColElem<T>> { 
    public int compare(RowColElem<T> o1, RowColElem<T> o2) { 
     int cmp = Integer.compare(o1.getCol(),o2.getCol()); 
     if(cmp != 0) { 
      return cmp; 
     } else { 
      return Integer.compare(o1.getRow(),o2.getRow()); 
     } 
    } 
} 

это один отдает приоритет колонок над строкой.

Вы можете сортировать списки с помощью метода Collections.sort:

Collections.sort(rowsElems,new CompareRowCol<T>());//create new comparator and sort 

Это изменит rowElems таким образом, что его элементы сортируются после вызова.

Рекомендовано не использовать два списка, содержащие одни и те же данные, поскольку это затруднит сохранение согласованности между ними. Используйте один список, который вы затем клонируете и сортируете.

Объяснение

Я только объяснить первый компаратор, поскольку другой его сопряженное, и аналогия легко.

Сначала мы сравним две строки из двух заданных элементов:

int cmp = Integer.compare(o1.getRow(),o2.getRow()); 

cmp является целым числом, то есть, если отрицательное число строк o1 меньше, чем номер строки o2; ноль, если оба числа равны; и положительный, если номер строки o1 больше номера строки o2.

Далее мы выполняем проверку:

if(cmp != 0) 

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

Теперь, если оба число строк равно, мы проводим сравнение по номерам столбцов:

return Integer.compare(o1.getCol(),o2.getCol()); 

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

+0

Спасибо за ответ, @CommuSoft. Прежде чем я приму ответ, не могли бы вы объяснить эти строки ?: 'int cmp = Integer.compare (o1.getRow(), o2.getRow()); if (cmp! = 0) { return cp; ' –

+0

@John: была опечатка: это' return cmp'. Пояснение добавлено. –