изменения в переменной не остаются вне цикла, а переменные не наследуются другим классам - PullRequest
0 голосов
/ 08 декабря 2018

Что я хочу сделать: читать строки с клавиатуры с помощью сканера, пока не будет использована конкретная строка для разрыва бесконечного цикла.сохраните их в arrayList, затем передайте их в массив, длина которого равна номеру итерации цикла

public class InputReader {
    ArrayList<Integer> list = new ArrayList<>(0);
    int arrayLength;
    String readInput;
    Scanner ir = new Scanner(System.in);
    void readInput() {

        for (int m=0; ;m++) {
                readInput = ir.nextLine();
                if ("q".equals(readInput)) {
                    //problem: arrayLength does not have the value of m outside the loop
                    arrayLength = m;
                    break;
                }         
                System.out.println("arrayLength: "+arrayLength);
                intInput = Integer.parseInt(readInput);
                list.add(intInput);
            }    
        }
        int[] array = new int[arrayLength];
    }
}

Внутри цикла arrayLength работает отлично, но вне цикла он не имеет значения, как я инициализировалэто без значения.Из-за этого

System.out.println("array.length: "+array.length);

всегда возвращает 0, а компилятор возвращает эту ошибку:

java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

, когда я пытаюсь сохранить целые числа внутри массива.1) Как я могу внести изменения в переменную, оставаясь за пределами цикла?

2) Странное наблюдение A:

int[] array = new int[list.size()];

возвращает ту же ошибку, несмотря на то, что list.size () имеет правозначение даже вне цикла (проверяется печатью).

И B: код работает, если я создаю свой массив внутри другого метода, а не внутри класса, а затем использую его в методе, но таким образом я не могуиспользуйте его в других моих классах, несмотря на использование наследования или параметров.

void giveOutput() {
    int[] array = new int[list.size()];
    public void giveOutput () {
        System.out.println("list.size()"+list.size());
        System.out.println("array.length:"+array.length);
        for (int n=0; n<list.size(); n++) {
            array[n] = list.get(n);
            System.out.print("array["+n+"]:"+array[n]+" ");
        }
    }
}

это создает рабочий массив, но я не могу передать его моему Minsort, расширяет подкласс InputReader, где он сортируется, что приводит к вопросу номер

3) Как использовать переменные, инициализированные в методах других классов?Таким образом, моя программа тоже может работать.

(Я чертовски новичок, вчера начал серьезно работать с Java, мой первый успешный проект - алгоритм Minsort-алгоритма, который я написал с нуля, поэтому, пожалуйста, помилуйте. И заранее спасибо.)

1 Ответ

0 голосов
/ 08 декабря 2018

Массив array инициализируется, когда создается объект типа InputReader, а не после запуска метода readInput().

Другими словами, array всегда инициализируется при использовании new InputReader(), а не после запуска метода readInput().Это означает, что переменная arrayLength еще не была изменена в момент создания array, поэтому используется значение по умолчанию для int, равное 0.

Попробуйте это:

public static class InputReader {
        ArrayList<Integer> list = new ArrayList<>(0);
        int arrayLength;
        String readInput;
        Scanner ir = new Scanner(System.in);
        int[] array;
        void readInput() {

            for (int m=0; ;m++) {
                readInput = ir.nextLine();
                if ("q".equals(readInput)) {
                    //problem: arrayLength does not have the value of m outside the loop
                    arrayLength = m;
                    break;
                }

                int intInput = Integer.parseInt(readInput);
                list.add(intInput);
            }
            System.out.println("arrayLength: "+arrayLength);
            array = new int[arrayLength];
        }
    }

Кроме того, ваш System.out.println("arrayLength: "+arrayLength); всегда возвращал 0, потому что arrayLength изменяется только при нажатии q.

Чтобы ответить на ваш третий пункт: вы можете создать функцию получения в классе InputReader.Например:

    public int[] getArray() {
        return array;
    }

Как примечание: очень хорошо, чтобы переменные вашего экземпляра объявлялись с модификатором частного доступа, а затем создавались общедоступные методы получения и установки.Это называется инкапсуляция и является принципом ООП (я советую вам использовать принципы ООП в Google).
Подробнее о геттерах и методах доступа здесь: Зачем использовать геттеры и средства настройки / метода доступа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...