如何创建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 :(得分: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());
我们可以立即返回结果,因为如果两个列号相等,那么这两个项也被认为是相等的。