You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

二、实现窗口覆盖面积计算程序

你的思路非常清晰,用矩阵模拟桌面像素、标记覆盖区域再统计的方法完全可行。下面是完整的实现步骤和代码:

实现步骤

  1. 确定桌面尺寸:可以用Java的Toolkit获取真实屏幕的宽高,也可以自己指定固定尺寸。
  2. 初始化矩阵:创建一个和桌面尺寸匹配的二维数组,所有元素初始为0(0代表未被窗口覆盖)。
  3. 处理每个窗口:先修正输入的坐标,确保x1 < x2y1 < y2(防止输入时坐标顺序搞反),然后遍历窗口覆盖的每一行,用Arrays.fill()把对应列的范围设为1(1代表被覆盖)。
  4. 统计覆盖面积:遍历整个矩阵,数出值为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

火山引擎 最新活动