Java中fill(int[] a,...)用于矩阵的方法及窗口覆盖面积计算问询
嘿,针对你提出的两个Java问题,我来一步步给你解答:
一、如何在矩阵(二维数组)中使用Arrays.fill()方法
Java的Arrays.fill()本身是给一维数组设计的,但矩阵本质是二维数组(int[][])——每个元素就是一行一维数组。所以要给矩阵用fill,只需要遍历每一行,对单独的行调用Arrays.fill()就行啦。
举几个实用的例子:
- 把整个矩阵填满同一个值:
import java.util.Arrays; public class MatrixFillDemo { public static void main(String[] args) { int[][] matrix = new int[3][4]; // 3行4列的矩阵 // 遍历每一行,全部填成5 for (int[] row : matrix) { Arrays.fill(row, 5); } } } - 给某几行的指定列范围填充值:
比如把第1、2行(索引从0开始算)的第2到第3列(左闭右开)填成1:for (int i = 1; i < 3; i++) { // 处理索引1和2的行 Arrays.fill(matrix[i], 2, 4, 1); // 填充从索引2到4的位置(不包含4) }
这里要记住Arrays.fill(int[] a, int fromIndex, int toIndex, int val)的规则:
fromIndex是起始位置(包含),toIndex是结束位置(不包含)- 如果
fromIndex等于toIndex,fill不会做任何操作 - 索引不能越界,不然会抛出
ArrayIndexOutOfBoundsException
二、实现窗口覆盖面积计算程序
你的思路非常清晰,用矩阵模拟桌面像素、标记覆盖区域再统计的方法完全可行。下面是完整的实现步骤和代码:
实现步骤
- 确定桌面尺寸:可以用Java的
Toolkit获取真实屏幕的宽高,也可以自己指定固定尺寸。 - 初始化矩阵:创建一个和桌面尺寸匹配的二维数组,所有元素初始为0(0代表未被窗口覆盖)。
- 处理每个窗口:先修正输入的坐标,确保
x1 < x2、y1 < y2(防止输入时坐标顺序搞反),然后遍历窗口覆盖的每一行,用Arrays.fill()把对应列的范围设为1(1代表被覆盖)。 - 统计覆盖面积:遍历整个矩阵,数出值为1的元素个数,就是窗口的总覆盖面积啦。
完整代码示例
import java.util.Arrays; import java.util.Scanner; import java.awt.Toolkit; import java.awt.Dimension; public class WindowCoverageCalc { public static void main(String[] args) { // 1. 获取真实屏幕尺寸(如果不需要真实尺寸,直接替换成new Dimension(1920, 1080)即可) Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); int screenWidth = screenSize.width; int screenHeight = screenSize.height; // 2. 初始化桌面矩阵,所有像素设为0 int[][] desktop = new int[screenHeight][screenWidth]; for (int[] row : desktop) { Arrays.fill(row, 0); } // 3. 读取窗口输入 Scanner scanner = new Scanner(System.in); System.out.print("请输入窗口数量:"); int windowNum = scanner.nextInt(); for (int i = 0; i < windowNum; i++) { System.out.printf("请输入第%d个窗口的x1 y1 x2 y2坐标:", i+1); int x1 = scanner.nextInt(); int y1 = scanner.nextInt(); int x2 = scanner.nextInt(); int y2 = scanner.nextInt(); // 修正坐标,确保起始坐标小于结束坐标 int startX = Math.min(x1, x2); int endX = Math.max(x1, x2); int startY = Math.min(y1, y2); int endY = Math.max(y1, y2); // 确保坐标不超出屏幕范围,避免数组越界 startX = Math.max(0, startX); endX = Math.min(screenWidth, endX); startY = Math.max(0, startY); endY = Math.min(screenHeight, endY); // 遍历窗口覆盖的每一行,填充为1 for (int y = startY; y < endY; y++) { Arrays.fill(desktop[y], startX, endX, 1); } } scanner.close(); // 4. 统计覆盖的像素数量 int totalArea = 0; for (int[] row : desktop) { for (int pixel : row) { if (pixel == 1) { totalArea++; } } } System.out.printf("窗口总覆盖面积为:%d 像素\n", totalArea); } }
小提示
- 用
Toolkit获取真实屏幕尺寸能让程序更贴合实际场景,如果是测试的话,直接写死宽高会更方便。 - 加入坐标修正和边界检查是为了避免输入错误导致的数组越界,让程序更健壮。
- 用
Arrays.fill()批量设置像素比逐个赋值效率高很多,尤其是屏幕尺寸较大的时候。
内容的提问来源于stack exchange,提问作者Masi




