创建四个不同的比较器

时间:2015-10-08 23:50:50

标签: java sorting arraylist comparator

如何创建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 
  }

}

1 个答案:

答案 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());
        }
    }
}

对于第二个,您只需将getRowgetCol交换:

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());

我们可以立即返回结果,因为如果两个列号相等,那么这两个项也被认为是相等的。