Я застрял при создании al oop для чтения 6 строк файла за раз, сохраняя каждую строку в переменной для последующего использования для расчетов - PullRequest
0 голосов
/ 01 апреля 2020

Проект состоит в том, чтобы проанализировать текстовый файл данных и предоставить статистику из него. Это файл фиксированного формата. Мы пишем новый файл фиксированного формата, используя данные, которые мы читаем. Что мы делаем, так это читаем Имя, Фамилию, Возраст, текущий доход, текущие сбережения и повышение. Есть 606 строк кода. Таким образом, мы должны прочитать первые 6 строк, затем l oop, прочитать 6 строк и сохранить данные. Затем мы должны найти количество людей по нескольким возрастным группам (например, 20-29, 30-39 и т. Д.). Найти минимальное и максимальное значение текущего дохода. Минимальная максимальная и средняя общая экономия. Пенсионный доход (Ежемесячно) мин. Макс. И средний. Выход на пенсию Средний доход в зависимости от возраста (например, 20-29, 30,39 и т. Д.). Последние два часа я перебираю свой учебник (большие java, поздние предметы) и прохожу свои прошлые задания, и я совершенно не знаю, с чего начать. Я студент первого курса университета по java программированию. Мы еще не использовали массивы. С чего мне начать? Я понимаю, что мне нужно сделать, но я не понимаю, чтение из файлов в любом случае. Из исследований, проведенных мной на inte rnet, есть так много разных способов, которыми люди делают, которых я никогда раньше не видел.

Текущий код (обратите внимание, я очень потерян в этом)

import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class MidtermProject {

    public static void main(String[] args) throws FileNotFoundException {

    // Declare the file 
    File inputFile = new File ("midterm.txt");
    Scanner in = new Scanner(new File("midterm.txt"));

    // Read first 6 lines 
    String One = in.nextLine();
    String Two = in.nextLine();
    String Three = in.nextLine();
    String Four = in.nextLine();
    String Five = in.nextLine();
    String Six = in.nextLine();

    // Set up loop to read 6 lines at a time  
    }
}
Example of some of the text file 
FirstName
LastName
Age
currentIncome
CurrentSavings
Raise
ROSEMARY
SAMANIEGO
    40
    81539.00
    44293.87
    0.0527
JAMES
BURGESS
    53
    99723.98
    142447.56
    0.0254
MARIBELL
GARZA
    45
    31457.83
    92251.22
    0.0345

1 Ответ

1 голос
/ 01 апреля 2020

Вы хотите прочитать этот файл по шесть строк за раз и выполнить расчеты на основе содержимого каждого набора. Во-первых, вам нужно место для размещения ваших значений, и внутренний класс stati c будет полезен:

private static class EmployeeData {
    final String firstName;
    final String lastName;
    final int age;
    final BigDecimal income;
    final BigDecimal savings;
    final BigDecimal raise;

    public EmployeeData(String firstName, String lastName, int age, BigDecimal income, BigDecimal savings, BigDecimal raise) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.income = income;
        this.savings = savings;
        this.raise = raise;
    }
}

Теперь у вас есть полезная структура данных, в которую вы можете поместить строки, которые читает ваш сканер. , (Обратите внимание, что мы используем BigDecimals вместо двойных, потому что мы делаем финансовые вычисления. Это имеет значение .)

    Scanner in = new Scanner(new File("midterm.txt"));

    while (in.hasNext()){

        String firstName = in.nextLine();
        String lastName = in.nextLine();
        int age = in.nextInt();
        BigDecimal income = in.nextBigDecimal();
        BigDecimal savings = in.nextBigDecimal();
        BigDecimal raise = in.nextBigDecimal();

        EmployeeData employeeData = new EmployeeData(firstName, lastName, age, income, savings, raise);
        BigDecimal power = calculatePower(employeeData);
    }

Теперь вы настроены на выполнение ваших расчетов, которые Я бы добавил в методы с соответствующим названием:

private static BigDecimal calculatePower(EmployeeData employeeData){
    int ageDifference = RETIREMENT_AGE - employeeData.age;
    BigDecimal base = employeeData.raise.add(BigDecimal.valueOf(1L));
    BigDecimal baseRaised = BigDecimal.valueOf(Math.pow(base.doubleValue(), ageDifference));
    return employeeData.income.multiply(baseRaised);
}

И вам нужно будет указать используемые константы:

private static final BigDecimal INTEREST = BigDecimal.valueOf(.07);
private static final int RETIREMENT_AGE = 70;
private static final BigDecimal WITHDRAWAL_PERCENT = BigDecimal.valueOf(.04);
private static final BigDecimal SAVINGS_RATE = BigDecimal.valueOf(.15);

Так что вы думаете? Это дает вам достаточно начала? Вот вся программа на данный момент; Я добавил аннотации, чтобы более подробно объяснить, что происходит:

import java.math.BigDecimal;
import java.util.*;

// The file name will have to match the class name; e.g. Scratch.java
public class Scratch {

    // These are values that are created when your class is first loaded. 
    // They will never change, and are accessible to any instance of your class.
    // BigDecimal.valueOf 'wraps' a double into a BigDecimal object.
    private static final BigDecimal INTEREST = BigDecimal.valueOf(.07);
    private static final int RETIREMENT_AGE = 70;
    private static final BigDecimal WITHDRAWAL_PERCENT = BigDecimal.valueOf(.04);
    private static final BigDecimal SAVINGS_RATE = BigDecimal.valueOf(.15);

    public static void main(String[] args) {
        // midterm.txt will have to be in the working directory; i.e., 
        // the directory in which you're running the program 
        // via 'java -cp . Scratch'
        Scanner in = new Scanner(new File("midterm.txt"));

        // While there are still more lines to read, keep reading!
        while (in.hasNext()){

            String firstName = in.nextLine();
            String lastName = in.nextLine();
            int age = in.nextInt();
            BigDecimal income = in.nextBigDecimal();
            BigDecimal savings = in.nextBigDecimal();
            BigDecimal raise = in.nextBigDecimal();

            // Put the data into an EmployeeData object
            EmployeeData employeeData = new EmployeeData(firstName, lastName, age, income, savings, raise);
            // Calculate power (or whatever you want to call it)
            BigDecimal power = calculatePower(employeeData);
            System.out.println("power = " + power);
        }
    }

    private static BigDecimal calculatePower(EmployeeData employeeData){
        int ageDifference = RETIREMENT_AGE - employeeData.age;
        // With big decimals, you can't just use +, you have to use 
        // .add(anotherBigDecimal)
        BigDecimal base = employeeData.raise.add(BigDecimal.valueOf(1L));
        BigDecimal baseRaised = BigDecimal.valueOf(Math.pow(base.doubleValue(), ageDifference));
        return employeeData.income.multiply(baseRaised);
    }
    // A static inner class to hold the data
    private static class EmployeeData {

        // Because this class is never exposed to the outside world, 
        // and because the values are final, we can skip getters and 
        // setters and just make the variable values themselves accessible 
        // directly by making them package-private (i.e., there is no '
        // private final' or even 'public final', just 'final')
        final String firstName;
        final String lastName;
        final int age;
        final BigDecimal income;
        final BigDecimal savings;
        final BigDecimal raise;


        public EmployeeData(String firstName, String lastName, int age, BigDecimal income, BigDecimal savings, BigDecimal raise) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.age = age;
            this.income = income;
            this.savings = savings;
            this.raise = raise;
        }
    }
}
...