Java实现二维数组排序(先行再列)

先按行排序,然后按列排序:

import java.util.Scanner; 
public class Text {	
	public static void main(String[] args) {
		//int[][] array= {{4,2},{1,7},{4,5},{1,2},{1,1},{4,1}};
		int[][] array= {{1,2,2,2,2},{1,2,2,7,2},{4,1,2,2,1},{1,3,2,3,6},{1,2,9,1,9},{4,8,2,9,8}};
		sort(array);//先按行排序,再按列排序
		for(int i=0;i<array.length;i++) {
			for(int j=0;j<array[0].length;j++)
				System.out.print(array[i][j]+" ");
			System.out.println();
		}
	}
	public static void sort(int[][] array) {
		for(int i=0;i<array.length-1;i++)//行排序
			for(int j=0;j<array.length-1-i;j++)
				if(array[j][0]>array[j+1][0])
					swap(array[j],array[j+1]);
		for(int f=1;f<array[0].length;f++)//f为当前要排序的列
			for(int i=0;i<array.length;) {
				int count=0;
				int num=array[i][f-1];
				if(f==1) {
					for(int j=0;j<array.length;j++)
						if(array[j][0]==num)
							count++;
				}
				else {//第一列以外的列 要统计该列之前所有列都和上一行相同的行的出现次数来决定该轮还要排序的次数
					for(int j=0;j<array.length;j++) {
						boolean isSame=true;
						for(int p=1;p<=f;p++)
							if(array[j][f-p]!=array[i][f-p]) {
								isSame=false;
								break;
							}
						if(array[j][f-1]==num&&isSame)
							count++;
					}
				}	
				for(int k=0;k<count-1;k++)
					for(int q=0;q<count-1-k;q++)
						if(array[i+q][f]>array[i+q+1][f])
							swap(array[i+q],array[i+q+1]);
				i+=count;//i为下一个不同的数的行下标
			}				
	}
	public static void swap(int[] a,int[] b) {//交换一行
		int temp;
		for(int j=0;j<a.length;j++) {
			temp=a[j];
			a[j]=b[j];
			b[j]=temp;
		}			
	}
}
小结:
开始的时候由于书上给的示例是一个6X2数组,导致思维被限制在只有两列的范围内,把f直接当作了1。事实上,应该考虑更多列的情况,因此应该设置一个变量f来指示当前需排序的列。
其中最值得一提的是计算count时要分情况讨论:不是第一列的情况下需要判断该列之前的所有列的值是否和上一行相等。因为这时候该列以前的列都已经排序完毕,若没有多加这个判断就有可能出现错误。
一开始只考虑到了该列的前一列需要比较,若和上一行的前一列相等count才加1。实际上这还是欠缺考虑。
eg.   
{1,2,2,2,2}
{4,1,2,2,1}
例如上示这种情况,若没有进行之前所有列 isSame的判断下面的行就会和上面的行进行交换,导致结果出错。
这里由于未知前面有几列,isSame可以用一个循环来获得判断结果。


实现效果:


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值