Как сделать так, чтобы массив созданный в функции выше был виден в функции ниже?

Рейтинг: -2Ответов: 1Опубликовано: 18.06.2023
// функция
public int[][] Numbers() throws FileNotFoundException {
    int[][] table = new int [10][10];
    String separator = File.separator;
    String path = separator + "Users" + separator + "vlad" + separator + "Desktop" + separator + "Test.txt";
    File file = new File(path);
    Scanner scanner = new Scanner(file);
      
    String line = scanner.nextLine();
    String[] numbersString = line.split(" ");
    int counter = 0;
    int[] numbers = new int [100];

    for (String number : numbersString) {
        numbers[counter++] = Integer.parseInt(number);
    }

    for (int j = 0; j < 10; j++) {
        for (int i = 0; i < 10; i++) {
            table[j][i] = numbers[i];  // этот массив нужно передать в функцию paint
        }
    }
    return table;
}     

public void paint(Graphics g, int array[][]) {
    super.paint(g);
    for (int x = 0; x < H; x++) {
        for (int y = 0; y < W; y++) {
            g.setColor(COLORS[table[x][y]]); // массив table не виден
            g.fillRect(y * size, x * size, size, size);
        }
    }
}

Ответы

▲ 1

У вас есть некий перегруженный метод paint с дополнительным параметром -- двумерным массивом array, который НЕ используется в показанной реализации, то есть достаточно было бы вместо table указать входной параметр этого метода / переименовать входной параметр в table.

public void paint(Graphics g, int table[][]) { // переименован аргумент
    super.paint(g);
    for (int x = 0; x < H; x++) {
        for (int y = 0; y < W; y++) {
            g.setColor(COLORS[table[x][y]]);
            g.fillRect(y * size, x * size, size, size);
        }
    }
}

Однако будет неэффективно, если массив данных будет передаваться при отрисовке данного компонента путём вызова метода Numbers():

@Override
public void paint(Graphics g) {
    paint(g, Numbers());
}

Поэтому имеет смысл создать поле в данном классе, проинициализировать его один раз, и при отрисовке использовать ссылку на это поле:

private int[][] data = Numbers();

@Override
public void paint(Graphics g) {
    paint(g, data);
}

// реализации Numbers / paint(Graphics g, int[][] a)
// ...