Java二维锯齿数组如何比较各列长度并校验是否存在等长列
二维锯齿数组列元素数量唯一性校验实现
前置说明
代码中用到了HashSet做去重校验,需要在文件开头补充导入:
import java.util.Set; import java.util.HashSet;
核心实现逻辑
优先推荐输入阶段实时校验,避免用户输入完全部内容才发现不合法浪费时间:
- 输入阶段实时校验:用户每输入一个列的行数,就和之前已输入的所有列的行数做比对,存在重复直接提示重新输入当前列的行数
- 输入完成后统一校验:全部内容输入完成后,提取所有列的长度做去重比对,判断是否存在重复值
代码修改示例
1. 输入阶段实时校验(修改列输入部分的逻辑)
你可以把原来的列输入循环替换为如下逻辑,不用等全部输入完再校验:
// 存储已经输入过的列长度,用于快速去重校验 Set<Integer> columnLengthSet = new HashSet<>(); for (int i = 0; i < columns; i++){ int rows; // 循环校验当前输入的列长度是否重复 while (true) { System.out.print("输入第" + (i + 1) + "列的行数:"); rows = input.nextInt(); if (columnLengthSet.contains(rows)) { System.out.println("输入不合法:已存在相同行数的列,请重新输入"); } else { columnLengthSet.add(rows); break; } } raggedArray[i] = new int[rows]; for (int j = 0; j < rows; j++) { System.out.print("输入第" + (j + 1) + "行的元素值:"); raggedArray[i][j] = input.nextInt(); } }
2. 输入完成后统一校验(替换你标注需要帮助的位置的代码)
如果你需要全部输入完成后再校验,可以用如下逻辑:
// 校验是否存在重复列长度 Set<Integer> lengthSet = new HashSet<>(); boolean hasDuplicate = false; for (int[] col : raggedArray) { // Set的add方法返回false说明元素已存在,即有重复列长度 if (!lengthSet.add(col.length)) { hasDuplicate = true; break; } } if (hasDuplicate) { System.out.println("输入不合法:存在2个及以上列的元素数量相同,请重新输入"); // 赋值repeat为99,触发循环重新输入 repeat = 99; } else { repeat = 0; // 输出各列的元素数量 int numberOfColumns = raggedArray.length; for (int i = 0; i < numberOfColumns; i++) { System.out.println("第" + i + "列共有" + raggedArray[i].length + "个元素"); } }
单指定列i的重复校验逻辑
如果你只需要判断某一个指定的第i列是否存在其他列和它元素数量相等,可以用如下逻辑:
/** * 校验指定索引的列是否存在其他列和它元素数量相同 * @param raggedArray 待校验的锯齿数组 * @param targetColumnIndex 待校验的列索引 * @return 存在重复返回true,否则返回false */ public static boolean hasDuplicateLengthForColumn(int[][] raggedArray, int targetColumnIndex) { int targetLength = raggedArray[targetColumnIndex].length; for (int i = 0; i < raggedArray.length; i++) { if (i != targetColumnIndex && raggedArray[i].length == targetLength) { return true; } } return false; }
内容的提问来源于stack exchange,提问作者user15448629
相关产品推荐
相关产品推荐

