Есть ли способ сохранить возвращаемые значения в виде массива в Java? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть программа Java, которую я написал в Eclipse, с целью сбора значений данных, хранящихся в Excel, и помещения их в корреляционный график для проверки гипотез с помощью плагина Nebula. Я использую буферизованный ридер для импорта своих данных и я смог получить данные, которые я хочу вернуть в консоль, используя инкапсуляцию и конструкторы. Мой вопрос: возможно ли / целесообразно сохранить этот вывод в массивах, чтобы я мог построить его? Моя мысль состоит в том, чтобы инициализировать массивы, а затем как-то сохранить выходные данные с помощью метода, но я застрял на том, как это сделать ....

РЕДАКТИРОВАТЬ: я должен уточнить - я спрашиваю о передаче моего объекта в параллельные массивы. Это хорошая практика или нет? И если да, то как это можно сделать наиболее эффективно?

Какой-то код (он длинный, но я не хочу ничего критичного исключать):

public class CovidPlots {

public static void main(String[] args) {
//Data source
    List<Book> stocks = readBooksFromCSV("COVID_DJI.csv");
    for (Book b : stocks) {
        System.out.println(b);
    }
private static List<Book> readBooksFromCSV(String fileName) {
        List<Book> stocks = new ArrayList<>();
        Path pathToFile = Paths.get("C:\\Users\\zrr81\\Downloads\\COVID-19_Analysis\\COVID_DJI.csv");

        //Try/catch IO exception for input file stream
        try (BufferedReader br = Files.newBufferedReader(pathToFile, StandardCharsets.US_ASCII)) {
             //Initialize counter to skip header
             int count = 0;
             String line = br.readLine();
             while(line != null) {
                 //Tell the reader to split the text when it hits the delimiter
                 String[] attributes = line.split(",");
                 Book book = createBook(attributes);
                 stocks.add(book);
                 count ++;
                 line = br.readLine();
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        return stocks;
    }

    //Create output arrays
    String[] days;
    double [] openers;
    double[] closers;

    //Import data into array "Book" 
     private static Book createBook(String[] metadata) {
            String day = metadata[0];
            double opener = Double.parseDouble(metadata[1]);
            double closer = Double.parseDouble(metadata[4]);
            return new Book(day, opener, closer);
    }

}

//Book class file (separate file in my package)
class Book {
//Define spreadsheet "Book"
    private String date;
    private double opener;
    private double closer;

    // All-args constructor, getters, setters and toString()
    // left out for brevity
}

1 Ответ

1 голос
/ 25 марта 2020

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

    //Create arrays that can hold output
    double[] opening;
    double[] closing;
    int len = stocks.size();
    opening = new double[len];
    closing = new double[len];
    int j = 0;
    for (Book x : stocks) {
        double o_value = x.getOpen();
        double c_value = x.getClose();
        opening[j] = o_value;
        closing[j] = c_value;
        j++;
    }

Это извлекает значения конструктора, даже если они являются частными, потому что он использует для каждого l oop с объектом того же типа, что и ArrayList. Это создает параллельные массивы с каждым хранением данных, которые мне нужно построить. До сих пор не знаю, является ли это лучшей практикой, учитывая, что я читал разные вещи на параллельных массивах, но это решает мою проблему.

...