
本文详解如何对两个10×10整型二维数组分别计算元素总和,并精确统计其中一位数、两位数、三位数的个数,同时对比两数组总和大小;提供可运行代码、结构优化建议及常见误区解析。
本文详解如何对两个10×10整型二维数组分别计算元素总和,并精确统计其中一位数、两位数、三位数的个数,同时对比两数组总和大小;提供可运行代码、结构优化建议及常见误区解析。
在Java中处理二维数组的聚合分析(如求和、分类统计)是基础但易出错的任务。原问题要求:① 生成两个10×10随机整数数组(范围0–999);② 分别计算两数组所有元素之和;③ 统计每个数组中一位数(0–9)、两位数(10–99)、三位数(100–999) 的出现次数;④ 比较总和并输出结果。当前代码存在三大核心缺陷:
- 方法职责混乱(如 suma_tabeli_1() 实际未求和,仅复制数组);
- 缺乏位数判断逻辑;
- 静态二维数组冗余、硬编码维度、可扩展性差。
以下为重构后的专业实现,遵循单一职责、可复用、可读性强的设计原则:
✅ 核心功能封装:通用工具方法
import java.util.Random;
public class ArrayAnalyzer {
private static final int ROWS = 10;
private static final int COLS = 10;
// 生成指定范围的随机二维数组
public static int[][] generateRandom2DArray(int range, int rows, int cols) {
Random r = new Random();
int[][] arr = new int[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = r.nextInt(range); // 生成 [0, range) 范围整数
}
}
return arr;
}
// 计算二维数组所有元素总和
public static int sumAllElements(int[][] arr) {
int sum = 0;
for (int[] row : arr) {
for (int val : row) {
sum += val;
}
}
return sum;
}
// 统计一位数、两位数、三位数的个数(返回长度为3的数组:[oneDigit, twoDigits, threeDigits])
public static int[] countByDigitLength(int[][] arr) {
int[] counts = new int[3]; // 索引0:1位, 1:2位, 2:3位
for (int[] row : arr) {
for (int val : row) {
if (val >= 0 && val <= 9) {
counts[0]++;
} else if (val >= 10 && val <= 99) {
counts[1]++;
} else if (val >= 100 && val <= 999) {
counts[2]++;
}
// 注意:本例中随机范围为0–999,故无需处理负数或4位及以上数
}
}
return counts;
}
// 打印二维数组(增强可读性)
public static void print2DArray(String title, int[][] arr) {
System.out.println("\n" + title + ":");
for (int[] row : arr) {
for (int val : row) {
System.out.printf("%4d ", val); // 对齐输出
}
System.out.println();
}
}
}✅ 主程序:清晰流程与结果对比
public class Main {
public static void main(String[] args) {
// 1. 生成两个10×10数组(0–999)
int[][] array1 = ArrayAnalyzer.generateRandom2DArray(1000, ArrayAnalyzer.ROWS, ArrayAnalyzer.COLS);
int[][] array2 = ArrayAnalyzer.generateRandom2DArray(1000, ArrayAnalyzer.ROWS, ArrayAnalyzer.COLS);
// 2. 打印数组(可选)
ArrayAnalyzer.print2DArray("Array 1", array1);
ArrayAnalyzer.print2DArray("Array 2", array2);
// 3. 计算总和
int sum1 = ArrayAnalyzer.sumAllElements(array1);
int sum2 = ArrayAnalyzer.sumAllElements(array2);
// 4. 统计位数分布
int[] counts1 = ArrayAnalyzer.countByDigitLength(array1);
int[] counts2 = ArrayAnalyzer.countByDigitLength(array2);
// 5. 输出分析结果
System.out.println("\n=== ANALYSIS RESULTS ===");
System.out.printf("Array 1 sum: %d | Array 2 sum: %d\n", sum1, sum2);
System.out.println("→ " + (sum1 > sum2 ? "Array 1 has the higher sum." :
sum2 > sum1 ? "Array 2 has the higher sum." : "Both arrays have equal sum."));
System.out.println("\nDigit-length distribution:");
System.out.printf("Array 1 → 1-digit: %d, 2-digit: %d, 3-digit: %d\n",
counts1[0], counts1[1], counts1[2]);
System.out.printf("Array 2 → 1-digit: %d, 2-digit: %d, 3-digit: %d\n",
counts2[0], counts2[1], counts2[2]);
}
}⚠️ 关键注意事项与最佳实践
- 位数判定边界明确:0–9为一位数(含0),10–99为两位数,100–999为三位数;若需包含负数,应先取绝对值再判断。
- 避免静态状态污染:原代码中大量static二维数组导致耦合度高、难以单元测试;重构后采用参数传递,符合面向对象设计原则。
- 数组维度解耦:将10×10定义为常量(ROWS/COLS),便于后续扩展为任意尺寸。
- 性能优化:使用增强for循环(for (int[] row : arr))提升可读性;单次遍历完成求和与统计,时间复杂度O(n²)最优。
- 健壮性补充:实际项目中应增加null检查与空数组校验,此处因生成逻辑确定非空而省略。
? 延伸思考:若需支持n维数组或动态范围(如统计4位数),可进一步抽象为泛型工具类或引入Stream API(Java 8+)实现函数式统计,例如:
Arrays.stream(arr).flatMapToInt(Arrays::stream).filter(x -> x >= 100 && x
通过以上实现,你不仅解决了原始需求,更掌握了Java数组分析的核心模式——分离关注点、消除重复逻辑、强化可维护性。
立即学习“Java免费学习笔记(深入)”;









