在2d数组中进行深度排序

时间:2017-06-08 10:32:09

标签: java sorting

我需要在java中实现类似于sql sort的功能,其中我有一个函数,我传递一个2d数组和2列索引,这个函数应该在提供的列索引上返回一个已排序的2d数组。

简而言之,我需要在2列上对2d数组进行排序。

我能够在1列上实现排序,PFB是相同的代码。

Arrays.sort(arr, new Comparator(){
        private int col ;
         public int compare(Object o1, Object o2) {
    String[] s1 = (String[])o1;
    String[] s2 = (String[])o2;
    return s1[col].compareTo(s2[col]);
    }

    private Comparator init(int var){
    col = var;
    return this;
}
}.init(0)
);

但是我需要增强此功能以基于2d数组中的2列进行排序。 我请专家帮我解决这个问题。

实施例 输入数组

1 2 3 4
1 8 2 8 
8 6 10 11
5 6 7 8
1 6 2 6 

Output : On sorting with Column 2,3 1 2 3 4 1 6 2 6 5 6 7 8 8 6 10 11 1 8 2 8

提前致谢, Raju

1 个答案:

答案 0 :(得分:0)

当第一列等于时,只需按第二列进行比较,如下所示:

int equal = s1[col].compareTo(s2[col]);
return equal == 0 ? s1[col2].compareTo(s2[col2]) : equal;

另请注意,您正在比较字符串(字典比较),而不是数字,因此" 10"会少于" 2",导致:

1 2 3 4 
8 6 10 11 
1 6 2 6 
5 6 7 8 
1 8 2 8 

按第2列和第3列排序时。

如果那不是您想要的,只需将数据转换为整数,然后以数字方式进行比较。

您也可以使用Comparator.thenComparing执行相同的操作:

  

thenComparing(Comparator other)   返回带有另一个比较器的字典顺序比较器。

     

如果此比较器认为两个元素相等,即比较(a,b)== 0,则使用其他元素来确定顺序。

Arrays.sort(array,
    Comparator.<String[],String>
    comparing(row -> row[1])
   .thenComparing(row2 -> row2[2])
);