
本文详解如何对两个10×10整型二维数组进行总和比较,并分别统计其中一位数、两位数和三位数的个数,提供可运行、结构清晰、符合面向对象原则的java实现方案。
本文详解如何对两个10×10整型二维数组进行总和比较,并分别统计其中一位数、两位数和三位数的个数,提供可运行、结构清晰、符合面向对象原则的java实现方案。
在实际开发中,处理多维数组的聚合分析(如求和、分类统计)是常见需求。原问题要求:① 生成两个10×10随机整数数组;② 比较二者元素总和,判定哪个更大;③ 分别统计每个数组中一位数(0–9)、两位数(10–99)、三位数(100–999) 的出现次数。原代码存在方法职责混乱、静态数组耦合过重、逻辑缺失(如未真正计算总和、未实现位数分类)等问题。以下给出专业、可维护、可扩展的重构实现。
✅ 核心设计原则
- 单一职责:每个方法只做一件事(填充、打印、求和、统计位数);
- 参数化:避免硬编码数组名,通过参数传递数组引用;
- 返回值驱动:计算类方法(如sumArray()、countDigits())返回结果,而非依赖静态变量;
- 语义清晰:使用英文标识符,符合国际协作规范。
? 完整可运行代码
import java.util.Random;
public class ArrayAnalyzer {
public static void main(String[] args) {
final int SIZE = 10;
final int RANGE = 1000; // 生成 [0, 999] 的随机数
// 1. 初始化两个二维数组
int[][] array1 = new int[SIZE][SIZE];
int[][] array2 = new int[SIZE][SIZE];
fillRandom(array1, RANGE);
fillRandom(array2, RANGE);
// 2. 打印数组(便于验证)
System.out.println("=== Array 1 ===");
printArray(array1);
System.out.println("\n=== Array 2 ===");
printArray(array2);
// 3. 计算总和并比较
long sum1 = sumArray(array1);
long sum2 = sumArray(array2);
System.out.printf("\n→ Sum of Array 1: %d%n", sum1);
System.out.printf("→ Sum of Array 2: %d%n", sum2);
System.out.println("→ Array with higher sum: " + (sum1 > sum2 ? "Array 1" : sum1 < sum2 ? "Array 2" : "Tie"));
// 4. 统计各数组中1/2/3位数个数
DigitCount count1 = countDigits(array1);
DigitCount count2 = countDigits(array2);
System.out.println("\n=== Digit Count Summary ===");
System.out.printf("Array 1 → 1-digit: %d, 2-digit: %d, 3-digit: %d%n",
count1.oneDigit, count1.twoDigit, count1.threeDigit);
System.out.printf("Array 2 → 1-digit: %d, 2-digit: %d, 3-digit: %d%n",
count2.oneDigit, count2.twoDigit, count2.threeDigit);
}
// 填充二维数组为 [0, max) 范围内的随机整数
static void fillRandom(int[][] arr, int max) {
Random rand = new Random();
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = rand.nextInt(max);
}
}
}
// 打印二维数组(格式化输出)
static void printArray(int[][] arr) {
for (int[] row : arr) {
for (int val : row) {
System.out.printf("%4d ", val);
}
System.out.println();
}
}
// 计算二维数组所有元素之和(使用 long 防止 int 溢出)
static long sumArray(int[][] arr) {
long sum = 0;
for (int[] row : arr) {
for (int val : row) {
sum += val;
}
}
return sum;
}
// 统计一位数(0–9)、两位数(10–99)、三位数(100–999)的个数
static DigitCount countDigits(int[][] arr) {
DigitCount result = new DigitCount();
for (int[] row : arr) {
for (int val : row) {
if (val >= 0 && val <= 9) {
result.oneDigit++;
} else if (val >= 10 && val <= 99) {
result.twoDigit++;
} else if (val >= 100 && val <= 999) {
result.threeDigit++;
}
// 注意:负数、≥1000 的数不计入任何类别(按题意范围限定为 [0, 999])
}
}
return result;
}
// 辅助类:封装位数统计结果
static class DigitCount {
int oneDigit = 0;
int twoDigit = 0;
int threeDigit = 0;
}
}⚠️ 关键注意事项
- 数值范围一致性:Random.nextInt(1000) 生成 [0, 999],天然满足1/2/3位数分类前提,无需额外处理负数或超限值;
- 溢出防护:10×10数组最大可能和为 999 × 100 = 99,900,虽在 int 范围内,但为体现工程严谨性,sumArray() 返回 long;
- 位数判定逻辑:严格按数学位数定义(0–9为1位,10–99为2位,100–999为3位),不依赖字符串转换,性能更优;
- 可扩展性提示:若需支持N位数统计或动态范围,可将 countDigits() 改为接收 int minDigits, int maxDigits 参数,并用循环替代硬编码分支。
✅ 总结
本教程不仅解决了原始问题中的“最高和判定”与“位数分类统计”两大核心需求,更通过方法抽象、数据封装与职责分离,将代码提升至生产就绪水平。开发者可直接复用 sumArray() 和 countDigits() 方法于任意二维 int[][] 数组,亦可轻松派生支持浮点、自定义范围或更高维度的变体。记住:清晰的接口、确定的输入输出、无副作用的纯函数,是高质量数组处理代码的基石。










