Помощь начинающим в передаче информации между классами - PullRequest
0 голосов
/ 06 мая 2018

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

Мой код выглядит следующим образом, и он все еще очень ранний, поэтому у меня просто есть некоторые переменные-заполнители, поскольку я ломал голову, пытаясь найти лучший подход к этой проблеме.

import java.io.*;

public class USCrimeArray {
String crimeArray[][] = new String[21][20];

    public void createCrimeArray() throws Exception{
        String crimeArrayInputString;
        int crimeArrayRowValue = -1;

        try (BufferedReader crimeArrayInput = new BufferedReader(new FileReader("C:/Users/Joey/Documents/Crime.csv"))) {
        while ((crimeArrayInputString = crimeArrayInput.readLine()) != null) {
            crimeArrayRowValue++;
            crimeArray[crimeArrayRowValue] = crimeArrayInputString.split(",");
        }
    } catch (IOException io) {
        io.getMessage();
    }
}

public USCrimeArray(){
        String[][] thisArray = crimeArray.clone();
}

public String[][] getCrimeArray(){
        return crimeArray.clone();
}
}

Это код для моего первого класса, и если я делаю deepToString внутри createCrimeArray, я получаю нужную информацию. Конструктор для USCrimeArray на самом деле еще не продуман, но мой главный вопрос - как записать информацию в crimeArray [] [], чтобы я мог перенести ее в другие классы.

Еще раз, эта основа теста не была продумана слишком далеко, потому что я все еще пытаюсь понять, почему мой метод не записывает криминальный массив [] [] с циклом while, и он выглядит следующим образом:

import java.util.Arrays;

public class USCrimeClass { 
    public static void main(String[] args) {
    USCrimeArray crimeArray = new USCrimeArray();
    String[][] test = crimeArray.getCrimeArray();
    System.out.println(Arrays.deepToString(test));
    }
} 

Я знаю, что многое я делаю здесь неправильно, но это конечный результат, который произошел после того, как все изменилось снова и снова, и не было никакого прогресса. Результатом системы в этом, очевидно, является просто массив нулевых элементов 21x20. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 06 мая 2018

Вам нужно позвонить createCrimeArray() в USCrimeClass

public class USCrimeClass { 
    public static void main(String[] args) {
        USCrimeArray crimeArray = new USCrimeArray();
        crimeArray.createCrimeArray();
        String[][] test = crimeArray.getCrimeArray();
        System.out.println(Arrays.deepToString(test));
    }
} 

Также

  1. в конструкторе USCrimeArray вы клонируете массив в локальную переменную thisArray, но никогда не используете его. это избыточно и может быть безопасно удалено.

  2. в getCrimeArray() вы возвращаете клон массива. в этом нет необходимости (если вы не хотите, чтобы USCrimeArray оставался неизменным). вы можете просто вернуть сам массив

Переменные экземпляра

переменные экземпляра являются нестатическими переменными уровня класса (очень похоже на crimeArray). Можно считать, что переменные экземпляра служат двум целям:

  1. «подробности» проблемной области класса. Например, Person class будет иметь переменные экземпляра, такие как firstName и lastName, которые являются данными одного человека.

  2. «конфигурационные» переменные, содержащие информацию, относящуюся к технологической среде и не относящуюся к проблемной области класса. Например, иногда можно найти класс с логической переменной экземпляра deleted, которая обозначает «мягко удаленный» экземпляр, который не должен быть представлен пользователю или включен в вычисления. цель этого заключается в поддержке отмены удаления.

, поэтому crimeArray относится к категории USCrimeArray. Общепринятой практикой является инициализация переменных экземпляра в конструкторе класса, поэтому к моменту создания нового экземпляра у вас будет тот, который содержит полные и действительные данные. Поэтому я бы переместил весь код createCrimeArray() в конструктор.

Если вам нужно изменить переменную экземпляра после ее инициализации, тогда можно использовать метод «setter». они имеют стандартизированную подпись: public void setCrimeArray(crimeArray[][]). наличие стандартизированной подписи позволяет вашему классу использоваться средами и библиотеками, которые добавляют функциональность. Например, хранение данных в реляционной базе данных, отправка / получение данных через Интернет и т. Д.

Теперь я вижу, что внешний ввод, который используется для заполнения массива, происходит из файла. При кодировании теперь USCrimeArray может читать только один конкретный файл из предопределенного местоположения файла. более гибкий способ для класса - получить спецификацию для внешнего ввода в качестве аргумента:

public USCrimeArray(String filename) {
    ... 
    try (BufferedReader crimeArrayInput = new BufferedReader(new FileReader(filename))) {
    ... 

}

теперь один и тот же класс можно использовать для обработки массива из разных файлов. теперь вы можете даже сделать имя файла аргументом Java-программы:

public class USCrimeClass { 
    public static void main(String[] args) {
        USCrimeArray crimeArray = new USCrimeArray(arg[0]);
        System.out.println(Arrays.deepToString(test));
    }
} 

теперь одна и та же Java-программа может обрабатывать разные файлы без необходимости перекомпиляции.

...