思路1
行列互换,然后直接获取行的最小值
- 分列,列数=二维数组中长度最长的一维数组的长度
- 循环嵌套,进行行列转换
- 依次获取行中最小值
public static void main(String[] args) throws Exception {
int[][] array = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7 }, { 8, 9, 10 }};
List<List<Integer>> 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<Integer> 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<int[]> 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中是允许二维数组中一维数组长度不一样的,所以才有了这篇记录。