Как я могу использовать fill (int [] a, int from_index, int to_index, int val) для матрицы в java?

Я хочу написать программу для расчета площади экрана, покрываемой разными окнами. У меня есть количество окон и x1, y1, x2, y2 каждого окна в качестве ввода. Я хочу использовать функцию заполнения в java. Я хочу создать матрицу размером с рабочий стол, полную нулей. Для каждого окна я хочу взять ширину окна и ввести ее в матрицу для такого количества строк, как высота окна, и сделать это для всех окон, а затем суммировать итоговую матрицу, подсчитывая единицы, давая мне площадь на экране, без необходимости иметь дело с перекрывающимися окнами. но я не знаю, как использовать заливку для матрицы.

Хотите заполнить массив нулями? Это оно? Или двумерный массив?

Robby Cornelissen 11.04.2018 11:36

двумерный массив. Я хочу заполнить некоторые элементы матрицы на 1. элементы, которые есть в каждом окне (x1, y1, x2, y2)

Masi 11.04.2018 11:49

Тогда подпись метода в вашем заголовке не имеет смысла.

Robby Cornelissen 11.04.2018 11:50
0
3
56
2

Ответы 2

Предположим, у вас есть двухмерный массив, например matrix[WIDTH][HEIGHT].
. Вы можете использовать метод Arrays.fill(), чтобы заполнить весь столбец одним вызовом. Однако вам все равно нужно перебирать столбцы.

Я создал небольшую программу для иллюстрации. Надеюсь, поможет:

import java.util.*;

public class TestArray
{
  public static final int SCREEN_WIDTH = 100;
  public static final int SCREEN_HEIGHT = 100;

  class WindowCoords
  {
    public int top;
    public int left;
    public int bottom;
    public int right;

    public WindowCoords(int top,
                        int left,
                        int bottom,
                        int right)
    {
      this.top = top;
      this.left = left;
      this.bottom = bottom;
      this.right = right;
    }
  } // class WindowCoords

  public List<WindowCoords> getWindows()
  {
    List<WindowCoords> result;
    result = new ArrayList<WindowCoords>();
    result.add(new WindowCoords(4, 67, 23, 89));
    result.add(new WindowCoords(18, 12, 65, 30));
    result.add(new WindowCoords(45, 3, 95, 15));
    result.add(new WindowCoords(67, 40, 93, 59));
    return (result);
  }

  public void run()
  {
    // Initialize matrix
    // Setting its contents to 0 not strictly necessary though I prefer to do so
    int[][] matrix;
    int     column;
    matrix = new int[SCREEN_WIDTH][SCREEN_HEIGHT];
    //for (column = 0; column < SCREEN_WIDTH; column++)
    //  Arrays.fill(matrix[column], 0);

    // Get windows
    List<WindowCoords> windows;
    windows = getWindows();

    // Fill covered screen
    Iterator<WindowCoords> it;
    WindowCoords           window;
    it = windows.iterator();
    while (it.hasNext())
    {
      window = it.next();
      for (column = window.left; column <= window.right; column++)
        Arrays.fill(matrix[column], window.top, window.bottom, 1);
    }

    // Show result
    int row;
    for (row = 0; row < SCREEN_HEIGHT; row++)
    {
      for (column = 0; column < SCREEN_WIDTH; column++)
        System.out.print(matrix[column][row]);
      System.out.println();
    }

  } // run

  public static void main(String[] args)
  {
    TestArray test;
    test = new TestArray();
    test.run();
  }

} // class TestArray

Нет необходимости заполнять матрицу нулями. int[][] matrix = new int[10][10]; предоставит вам матрицу 10x10, в которой все значения установлены по умолчанию, то есть 0 для int.

Robby Cornelissen 11.04.2018 12:27

@RobbyCornelissen: Ты прав. Может я просто фундаменталист. Я обновил ответ.

Robert Kock 11.04.2018 12:37

Не думайте, что вы фундаменталист. Определенно старая школа, глядя на форматирование вашего кода, предварительные объявления переменных и использование итераторов :)

Robby Cornelissen 11.04.2018 12:46

Знаю, старею :-)

Robert Kock 11.04.2018 13:49

Спасибо @Robert Kock за очень полезный ответ.

Masi 11.04.2018 15:05

Но у меня все еще проблема. когда у меня есть одно окно (0 0 2 2) с размером экрана (5 5), мы имеем [1 1 0 0 0, 1 1 0 0 0, 0 0 0 0 0, 0 0 0 0 0]. если я добавлю еще одно окно (1 1 3 3), оно должно быть [1 1 0 0 0, 1 1 1 0 0, 0 1 1 0 0, 0 0 0 0 0, 0 0 0 0 0]. сумма единиц должна быть 7. а теперь 9. [1 1 1 0 0, 1 1 1 0 0, 1 1 1 0 0, 0 0 0 0 0, 0 0 0 0 0]

Masi 11.04.2018 15:18

@Masi: Ваше окно (0,0,2,2) должно быть (сверху, слева, ширина, высота) или (сверху, слева, снизу, справа)? Вроде первый. В этом случае ваше 2-е окно имеет ширину 3 и начинается со 2-го ряда. Следовательно, вторая строка должна быть [1,1,0,0,0] для 1-го окна и [0,1,1,1,0] для 2-го окна. Вместе это составляет [1,1,1,1,0]. Попробуйте вытянуть это.

Robert Kock 11.04.2018 15:41

мое окно (сверху, слева, снизу, справа). Вторая строка должна быть [1,1,0,0,0] для 1-го окна и [0,1,1,0,0] для 2-го окна. но их сумма равна [1, 1, 1,0, 0]. проблема, связанная с первой и третьей строкой. в первой строке: первое окно [1 1 0 0 0], второе окно: [0 0 0 0 0]. Сумма должна быть [1 1 0 0 0]. но он показывает мне [1 1 1 0 0]

Masi 11.04.2018 16:00

@Masi: Возможно, мне что-то не хватает, но ваши окна (0,0,2,2) и (1,1,3,3) имеют ширину и высоту 3. Таким образом, вторая строка должна быть [1,1 , 1,0,0] для 1-го окна и [0,1,1,1,0] для 2-го окна. Не могли бы вы опубликовать свой код.

Robert Kock 11.04.2018 16:18

(0,0,2,2) и (1,1,3,3) - координатные точки на осях x и y. поэтому площадь каждого равна 4. (2-0) * (2-0) = 4 и (3-1) * (3-1) = 4. но они пересекаются. удалив перекрытие, мы получим 7 в качестве нашей покрытой области

Masi 11.04.2018 20:54

@Robert, я добавляю свой код под своим вопросом. формат ввода - n (количество окон), затем x1, y1, x2, y2 для каждого окна. выход должен быть закрытым. Я еще не суммировал их в своем коде.

Masi 11.04.2018 20:59

Подойдет простой вложенный цикл:

public static void main(String[] args) {
    int[][] matrix = new int[10][10];
    fill(matrix, 2, 2, 4, 4);

    System.out.println(Arrays.deepToString(matrix));
}

private static void fill(int[][] matrix, int x1, int y1, int x2, int y2) {
    for (int y = y1; y <= y2; y++) {
        for (int x = x1; x <= x2; x++) {
            matrix[y][x] = 1;
        }
    }
}

Другие вопросы по теме