1.项目场景
在做AHP评价系统过程中,用到的判断矩阵是一个沿着对角线的倒数对称的数字矩阵。用户只需要输入对角线上的数字,便会自动生成全部矩阵。
如下图所示:
2. 需求
用户输入的数字存在一个数组的中【3, 7,3, 5,5, 3,5,。。。。】,需要按照索引顺序从前往后将该数组的值 添加到一个二维数组对角线以上。 如下图的紫色部分。
提示:以下是本篇文章正文内容,下面案例可供参考
3. 实现:
思考:
1.对角线以上的二维矩阵所在索引,我们可以用俩个for循环来实现。第一个循环遍历行(维度),第二个遍历表示该行第几个元素。
2. 数组的元素是从前往后提取。其实这种方式类似于队列,先进去的需要先提取。但是现在数组已经输入完毕是固定的。可以用指针指在第一个元素,每次提取只第一个元素,提取后指针往后移动一个。java中的数组没有直接提取首个元素的方法,并且初始化后的数组长度是固定的不能改变。
代码实现思路:
先取数,每次取完第一个元素A【0】之后,利用数组拷贝把刚才取得数删除,此时索引0指针继续指在新数组的首个元素,但是已经是原数组的后一个数上。
拷贝截取后的数组如下:
代码:
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
Double v = num[0];
if (num.length >= 1) {
num = Arrays.copyOfRange(num, 1, num.length); //删除第一个元素
}
ahpDemoClass.matrix[i][j] = v; //赋值到二维数组中使用
}
}
copyOfRange 数组拷贝的参数
T[] original,: 原数组
int from, : 拷贝开始的索引
int to: 拷贝 结束的索引
源代码:
public static <T> T[] copyOfRange(T[] original, int from, int to) {
return copyOfRange(original, from, to, (Class<? extends T[]>) original.getClass());
}
剩余项的输入:
System.out.println("根据输入值自动填写矩阵剩余项");
//对角线上的数字
for (int i = 0; i < N_mat; i++) {
matrix[i][i] = 1.0;
}
for (int i = N_mat - 1; i >= 0; i--) {
for (int j = N_mat - 1; j >= 0; j--) {
matrix[i][j] = 1 / matrix[j][i];
}
}