Не передаются значения из метода в массив

205
01 марта 2017, 19:15
public class Main {
    final static double a = 1.5;
    final static double deltaX = 0.005;
    static double y = 0;
    static int steps = 0;
    private static double arrayX[];
    public static void main(String[] args) {
        Tabul();
        FindStepsQuantity();
        createArrayOfXValues(arrayX);
    }
    public static void Tabul() {
        for (double x = 0.8; x <= 2.0; x = x + deltaX) {
            if (x < 1.7) {
                y = Math.PI * x * x - 7 / x * x;
            }
            else if (x == 1.7) {
                y = a * x * x * x + 7 * Math.sqrt(x) + Math.log10(x + 7 * Math.sqrt(x));
            }
            else {
                y = Math.log10(x + 7 * Math.sqrt(x));
            }
        }
    }
    public static int FindStepsQuantity() {
        for (double i = 0.8; i <= 2.0; i = i + deltaX) {
            steps++;
        }
        System.out.println(steps);
        return steps;
    }
    public static void createArrayOfXValues(double[] array) {
        array = new double[steps];
        for (int i = 0; i < array.length; i++) {
            y = array[i];
            System.out.println(array[i]);
        }
    }

Не могу понять почему метод createArrayOfXValues не заполняет массив значениями y, которые были получены в методе Tabul. Если y статическая переменная, то она ведь должна менять значение после вызова метода Tabul.

Что я упускаю?

Answer 1

В методе Tabul (в Java, кстати, принято называть методы с маленькой буквы) в поле y по очереди присваиваются все значения, в результате чего в y хранится только последнее значение.

В методе createArrayOfXValues при создании нового массива array = new double[steps] исходный массив arrayX, переданный в метод, никоим образом не меняется. А в строке y = array[i] в поле y на каждой итерации пишется значение по умолчанию (0.0) из соответствующей ячейки массива.

Если нужно просто сохранить все значения y, полученные в методе Tabul, то сделать это можно так:

private static final double
        A = 1.5,
        MIN_X = 0.8,
        MAX_X = 2.0,
        DELTA_X = 0.005;
public static void main(String[] args)
{
    List<Double> list = tabul();
    System.out.println(list);
}
public static List<Double> tabul()
{
    List<Double> values = new ArrayList<>();
    for (double x = MIN_X; x <= MAX_X; x += DELTA_X)
    {
        double y;
        if (x < 1.7)
        {
            y = Math.PI * x * x - 7 / x * x;
        }
        else if (x == 1.7)
        {
            y = A * x * x * x + 7 * Math.sqrt(x) + Math.log10(x + 7 * Math.sqrt(x));
        }
        else
        {
            y = Math.log10(x + 7 * Math.sqrt(x));
        }
        values.add(y);
    }
    return values;
}

Вместо double[] используется List<Double>, но при желании можно создать массив на базе списка:

double[] array = new double[list.size()];
for (int i = 0; i < list.size(); i++)
{
    array[i] = list.get(i);
}

Либо с использованием Java 8:

double[] array = list.stream().mapToDouble(e -> e).toArray();

В коде остались "магические константы" 1.7и 7. Так как я не знаю что они обозначают, то в константы их не вынес.

READ ALSO
Передача ссылки на объект в другую активность Android

Передача ссылки на объект в другую активность Android

Задача: В первой активности Activity1 мы создаем экземпляр класса VeryFatClass:

210
Динамическая генерация xml по xsd Java

Динамическая генерация xml по xsd Java

Необходимо в java коде динамически гинерировать xml по xsd схеме, в которой есть элементы с разными паттернамиНапример:

273
Не читается файл переданный через socket

Не читается файл переданный через socket

Я передаю файл-картинку програмкой на qt через интернет по сокетам:

285
Скрытие и показ панели навигации

Скрытие и показ панели навигации

ЗдравствуйтеСкрываю системные панели в onCreate:

236