JAVA获取二维数组中每一列的最小值

思路1

行列互换,然后直接获取行的最小值

  1. 分列,列数=二维数组中长度最长的一维数组的长度
  2. 循环嵌套,进行行列转换
  3. 依次获取行中最小值
public static void main(String[] args) throws Exception {
		int[][] array = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7 }, { 8, 9, 10 }};
		List> tempArray = new ArrayList<>();
		int maxLength = 0;
		//获取最长的一维数组的长度做为列数
		for (int i = 0; i < array.length; i++) {
			for (int j = 0; j < array[i].length; j++) {
				maxLength = array[i].length > maxLength ? array[i].length : maxLength;
			}
		}
		//外层循环列数
		for (int j = 0; j < maxLength; j++) {
			//构造一个集合,将一列的数据存在这个集合里
			List list = new ArrayList<>();
			//内层循环行数,获取二维数组中同一列的数据放入即可中
			for (int i = 0; i < array.length; i++) {
				//防止索引越界,因为array[i].length<=j的话,array[i][j]则越界了,即当前列的i行处没有数据
				if (array[i].length > j) {
					list.add(array[i][j]);
				}
			}
			tempArray.add(list);
		}
		tempArray.stream().forEach(t->System.out.print(t.stream().min(Integer::compare).get()+" "));
	}

其中行列转换是将所有列的数据放入一个集合里面,最后用集合处理的
结果

1 2 10 

思路二

依次获取某个一维数组中的数据,然后去和其他一维数组中对应位置的数据去比较,获取最小值,存下来
考虑到列数,需要讲二维数组中的数据按一维数组长度排序

public static void main(String[] args) {
		int[][] array = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7 }, { 8, 9, 10 } };
		// 根据二维数组中的一维数组长度排序
		List list = Arrays.stream(array).sorted((arr1, arr2) -> {
			return arr2.length - arr1.length;
		}).collect(Collectors.toList());

		for (int i = 0; i < list.size(); i++) {
			array[i] = list.get(i);
		}
		int maxLength = array[0].length;// 获取列的个数
		int[] tempArray = new int[maxLength];
		//外层循环列 从0列开始
		for (int i = 0; i < maxLength; i++) {
			int min = array[0][i];// 寄存该列的第一个数字为最小值(即第一个一维数组中某列的数据)
			for (int j = 1; j < array.length; j++) { 
				//防止索引越界,因为array[j].length>i的话,array[j][i]一定索引越界,即在当前列的i行处没有数据
				if (array[j].length <= i) {
					break;
				}
				//拿第一个一维数组中某列的数据和其他行相同列的数据比较
				if (array[j][i] < min) {
					min = array[j][i];
				}
			}
			tempArray[i] = min;
		}
		System.out.println("列的最小值分别为:");
		for (int i = 0; i < maxLength; i++) {
			System.out.print(tempArray[i] + " ");
		}

	}

在内存循环中需要判断array[j].length <= i,防止索引异常,比如
上面代码中,在外层第二次循环进入的时候,我拿着9(这时的i=1)去按个和{ 1, 2 }中的2,{ 3, 4 }中的4,{ 5, 6 }中的6比较,到这时候都没有问题,但是当去和{ 7 }中的第二个数据时就会出现索引越界,因为{ 7 }长度小于等于1,那么此时的array[j][i]必然越界
结果

列的最小值分别为:
1 2 10 

其实是这是一道面试题,当时是按照二维数组中一维数组的长度都一样的情况做的,但是java中是允许二维数组中一维数组长度不一样的,所以才有了这篇记录。

你可能感兴趣的:(java)