数组---飘点

计算数组中所在最大值所在列最小值的坐标 (数组飘点)


Integer FirstIndex=0; //所在行
Integer SecondIndex=0; //所在列
int [] [] array=new int[][] {{10,9,3},{4,5,6}, {14,25,36},{18,19,20}};
//存放每一列数组中最大值对应的 一维坐标 二维坐标 值
// ps:保留一维坐标,是因为map中的key唯一,避免二维坐标重重,导致数据不完整
Map<Integer,Map<Integer, Integer> > map = new HashMap<Integer,Map<Integer, Integer>>();
//计算每行的最大值
int [][] a=new int[array.length][1];
for (int i = 0; i < array.length; i++) {
int[] aa= array[i];
//此处在排序之前,需要先将数组复制一份,再排序复制的数组,否则会改变原有数组的结构
int[] bb=new int[ aa.length];
System.arraycopy(aa, 0, bb, 0, aa.length);
Arrays.sort(bb);
int b=bb[aa.length-1]; //二维数组 第二维中数组的最大值
for (int k = 0; k < aa.length; k++) {
if (aa[k]==b) { //找出最大值所在的下标
Map<Integer,Integer> m=new HashMap<Integer,Integer>();
m.put(k, aa[k]);
map.put(i, m);
}
}
}

//遍历map,同时排序value,得到整个数组的最大值及其所在数组的二维坐标
Set<Entry<Integer, Map<Integer, Integer>>> entrySet = map.entrySet();
//接收二维数组最大值所在的 第二维的下标值及其最大值
List<Entry<Integer, Integer>> list=new ArrayList<>();

for (Entry<Integer, Map<Integer, Integer>> entry : entrySet) {
Set<Entry<Integer, Integer>> value = entry.getValue().entrySet();
for (Entry<Integer, Integer> entry2 : value) {
list.add(entry2);
}
}

//排序 lombo语法 倒序排序
Collections.sort(list, (o1,o2) -> o2.getValue() .compareTo(o1.getValue()));
//最大值所在的二维坐标及值
Entry<Integer, Integer> entry = list.get(0);
//最大值
Integer value= entry.getValue();
//二维坐标
SecondIndex = entry.getKey();

Map<Integer,Integer> map2=new HashMap<Integer,Integer>(); //接收最大值所在二维坐标对应的每个一维坐标及其值
//遍历数组 求其最大值所在所有列的值
for (int i = 0; i < array.length; i++) {
int[] aa= array[i];
if (aa.length>SecondIndex) { //避免数组下标越界
map2.put(i, aa[SecondIndex]);
}
}
Set<Entry<Integer, Integer>> entrySet3 = map2.entrySet();
ArrayList<Entry<Integer, Integer>> list2 = new ArrayList<>(entrySet3);
//正序排序
Collections.sort(list2, (o1,o2) -> o1.getValue().compareTo(o2.getValue()));
Entry<Integer, Integer> entry2 = list2.get(0);
FirstIndex=entry2.getKey();

System.out.println(“所在行:”+FirstIndex);
System.out.println(“所在列:”+SecondIndex);
System.out.println(“飘点值:”+array[FirstIndex][SecondIndex]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值