存储和检索数组中的数据,导出到文本文件

时间:2016-03-02 20:35:33

标签: java arrays oop fileoutputstream

我是java的新手,在我学习的时候,我正在研究数组,我似乎对这里的错误感到茫然。我不认为它正在以正确的方式提取数据,this program is suppose to read data from a text file, and ask the user for additional inputs, then display a report.我似乎对捐赠输出位有问题,因为我还没有让它工作一次......程序剂量编译并运行, netbeans说它的全部为绿色,除了下面显示方法的禁用代码位。非常感谢任何建议,评论和正确方向的点=) 对于文本文件输出和程序显示输出,也可以使用一些关于获取小数位的建议。

主要课程

import java.util.Scanner;

public class MyEventManager 
{
    public static void main(String [] args)           
    {
        Scanner keyboard = new Scanner(System.in);
            System.out.printf("\nI will read a text file then add it with user "
                + "inputs in \norder to display and export a report detailing "
                + "an event.\n\n");
        boolean startOver = false;

        if (startOver == false)   //enter loop
        {
            do
            { 
                //ticket price
                System.out.printf("What is the single ticket price for "
                        + "the event? ");
                double singleTicket = keyboard.nextDouble();
                //maximum number of donations
                System.out.printf("What is the maximum number of donations "
                        + "expected for the event? ");
                int maxDonations = keyboard.nextInt();
                //create a new object for event class
                MyEventClass myEvent = new MyEventClass(singleTicket,
                        maxDonations);

                if (myEvent.fruityLoops == false)
                    do
                    {
                        myEvent.readAllData();
                    }
                while (myEvent.fruityLoops != true);

                myEvent.displayResults();

                System.out.printf("\nWould you like to run program again? "
                        + "[Y/N] - ");
                String questionAskLoop = keyboard.next();

                if ("N".equalsIgnoreCase(questionAskLoop))
                {
                    startOver = true; //sets exit condition to end program...
                }
            }
        while(startOver != true);    
        }
    }
}

第二课

import java.util.Scanner;
import java.io.*;
import java.util.Arrays;

public class MyEventClass 
{
    private final double TICKET_PRICE;
    private final int []moneyDonated;
    private double totalTicketsSold;
    private int DONATION_ARRAY_SIZE;
    private int storedAmountDonations;
    private double moneySpent;
    boolean fruityLoops;
    private boolean donationSuccess;
    public static char amountType;
    public static double amount;


    public MyEventClass (double singleTicket, int maxDonations)
    {
        this.moneyDonated = new int[]{DONATION_ARRAY_SIZE};
        this.fruityLoops = false;
        this.TICKET_PRICE = singleTicket;
        this.DONATION_ARRAY_SIZE = maxDonations;
        this.moneySpent = 0;
    }

    public boolean myDonation (double donationAmount, int[] moneyDonated)
    {
        if (storedAmountDonations  == DONATION_ARRAY_SIZE)
        {
            return false;  
        }
        else
        {
            moneyDonated[storedAmountDonations] = (int) donationAmount;
            storedAmountDonations++;
            return true;
        }
    }

    public void addNewTickets (double addedTickets)
    {  
        totalTicketsSold += (int) addedTickets;
    }

    public double getTicketSales ()
    {  
        return totalTicketsSold;
    }

    public double getTicketEnd ()
    {
        double ticketEnd = totalTicketsSold * TICKET_PRICE;
        return ticketEnd;
    }

    public int [] getMoneyDonated (int[] moneyDonated)
    {
        //Calculate and return the total amount of money donated
        return moneyDonated;
    }

    public int storedAmountDonations ()
    {
        return storedAmountDonations;
    }

    public double getMoneySpent ()
    {
        return moneySpent;
    }

    public void sortMethod (char amountType, double amount)
    {
        if(amount <= 0)     //positive amount check
        {
         throw new IllegalArgumentException("Error Code B-90: Invalid amount "
                 + "(not over 0) -- line: " + amountType + " " + amount 
                 + " ignored");
        }
        else if (amountType == 'T' || amountType == 't')    //tickets
        {
            addNewTickets(amount);
        }
        else if (amountType == 'D' || amountType == 'd')    //donations
        {
            myDonation(amount, moneyDonated);   
            if (donationSuccess == false)    //checks if array is full
            {
                throw new ArrayIndexOutOfBoundsException ("Error code B-103: "
                        + "The array is full " + amount + " will not be stored"
                        + " in the array");
            } 
        }
        else if (amountType == 'E' || amountType == 'e')    //amount spent
        {
           moneySpent += amount;   
        }
        else 
            throw new IllegalArgumentException("Error Code B-113: Invalid item "
                    + "type (not T, D, or E) -- line: " + amountType + " " 
                    + amount + " ignored");
    }

    public void readAllData()
    {
        int lineCount = 0; 
        Scanner keyboard = new Scanner( System.in );
        System.out.printf("\nPlease input the file location: ");
        String readFile = keyboard.next();

        try
        {   
            File inputFile = new File (readFile);
            Scanner scanFile;
            scanFile = new Scanner( inputFile );
            System.out.println("Reading data file....");

            while (scanFile.hasNext())
            {
                amountType = scanFile.next().charAt(0);
                amount = scanFile.nextDouble();

                lineCount++;

                try
                {
                    sortMethod(amountType, amount);
                }
                catch (IllegalArgumentException a)
                {
                    System.out.printf("\nError code B-145: An error occured "
                            + "while attempting to add the data from file");
                }
                catch (ArrayIndexOutOfBoundsException b)
                {
                    System.out.printf("\nError code B-150: An error occured "
                            + "while attempting to add to the array.");
                }
            }
            scanFile.close();
            System.out.printf("\nThe total amount of readable lines where " 
                    + lineCount + " lines.\n\n");
        }
        catch (FileNotFoundException c)
        {
            System.out.printf("\nError code B-160: The file " + readFile
                + " was not found!\n");
            fruityLoops = false;    //restart program
        }
        fruityLoops = true; //contuine on with program
    }

    public int getLowest (int[] moneyDonated)
    {
        int lowValue = moneyDonated[0]; 
        for(int i=1;i < moneyDonated.length;i++)
        { 
            if(moneyDonated[i] < lowValue)
            { 
                lowValue = moneyDonated[i]; 
            } 
        }

        return lowValue; 
    }

    public double getAverage(int[] moneyDonated)
    {
        int sum = moneyDonated[0]; 
        for(int i=1;i < moneyDonated.length;i++)
        sum = sum + moneyDonated[i];

        double advValue = sum / moneyDonated.length;

        return advValue; 
    }

    public int getHighest (int[] moneyDonated)
    {
        int maxValue = moneyDonated[0]; 
            for(int i=1;i < moneyDonated.length;i++)
        { 
            if(moneyDonated[i] > maxValue)
            { 
                maxValue = moneyDonated[i]; 
            } 
        } 

        return maxValue; 
    }


    public void displayResults()
    { 
        double income = 0;//moneyDonated + ticketEnd;
        double profits = income - moneySpent;

        Scanner keyboard = new Scanner ( System.in );
        System.out.printf("\nWhere is the file for the report export? ");
        String reportFile = keyboard.next();

        try
        {
            File outputFile = new File (reportFile);
            Scanner scanFile = new Scanner (outputFile);
            System.out.println("Generating output data file....");
            try (BufferedWriter writer = 
                    new BufferedWriter(new FileWriter(outputFile)))
            {
                writer.write("Event Overall Outcome:");
                writer.newLine();

                writer.write("Ticket Price %15.2f" + TICKET_PRICE);
                writer.newLine();
                writer.newLine();

                writer.write("Donation Analysis:");
                writer.newLine();

                writer.write("Lowest donation " + getLowest (moneyDonated));
                writer.newLine();

                writer.write("Adverage donation " + getAverage (moneyDonated));
                writer.newLine();

                writer.write("Highest donation " + getHighest(moneyDonated));
                writer.newLine();
                writer.newLine();

                writer.write("Profit/Loss Results:");
                writer.newLine();

                writer.write(totalTicketsSold + "Tickets sold" + getTicketEnd());
                writer.newLine();

                writer.write(storedAmountDonations() + " Donations " 
                        + Arrays.toString(moneyDonated) + " +");
                writer.newLine();

                writer.write("                      --------");
                writer.newLine();

                writer.write("Total Income " + "%14.2f" + income);
                writer.newLine();

                writer.write("Total Expenses " + "%12.2f" + " -" + moneySpent);
                writer.newLine();

                writer.write("                      --------");
                writer.newLine();

                if (profits < 1)
                {
                    writer.write("  Event Losses " + "%13.2f " + profits);
                }
                else
                {
                    writer.write("  Event Profits " + "%13.2f " + profits);
                }

                writer.flush();
                writer.close();
            }
            catch (IOException d)
            {
                System.out.printf("\nError code B-280: There was an error "
                        + "while attempting to write to " + reportFile 
                        + "\nThe file may be damaged!");
            }
            System.out.printf("\nOutput Success!");
        }
        catch (FileNotFoundException d)
        {
            System.out.printf("\nError code B-288: The file " + reportFile
                + " could not be opened! The report cannot be generated.\n");   
        }


        System.out.printf("\nEvent Overall Outcome:");

        System.out.printf("\n\n  Ticket Price %15.2f", TICKET_PRICE);

        System.out.printf("\n\n  Donation Analysis: ");
        /*System.out.printf("\n  Lowest donation " + "%10.2f",
        getLowest (moneyDonated));
        System.out.printf("\n  Adverage donation " + "%10.2f",
        getAverage (moneyDonated));
        System.out.printf("\n  Highest donation " + "%10.2f",
        getHighest(moneyDonated));*/

        System.out.printf("\n\n  Profit/Loss Results: ");
        System.out.printf("\n  " + totalTicketsSold + " Tickets sold " 
                /*+ "%3.2f"*/ + getTicketEnd());
        System.out.printf("\n  " + storedAmountDonations() + " Donations " 
                /* + "%3.2f"*/ + Arrays.toString(moneyDonated) + " +");
        System.out.printf("\n                      --------");
        System.out.printf("\n  Total Income " + "%14.2f", income);
        System.out.printf("\n  Total Expenses " + "%12.2f" + " -", moneySpent);
        System.out.printf("\n                      --------");

        if (profits < 1)
        {
            System.out.printf("\n  Event Losses " + "%13.2f \n\n", profits);
        }
        else
        {
            System.out.printf("\n  Event Profits " + "%13.2f \n\n", profits);
        }
    }
}

这是文本文件输入

T 25
E 210.99
T 1
D 500.00
E 134.67
D 1

这是文本文件输出

Event Overall Outcome:
Ticket Price %15.2f60.0

Donation Analysis:
Lowest donation 500
Adverage donation 500.0
Highest donation 500

Profit/Loss Results:
26.0Tickets sold1560.0
1 Donations [500] +
                      --------
Total Income %14.2f0.0
Total Expenses %12.2f -345.65999999999997
                      --------
  Event Losses %13.2f -345.65999999999997

最后这是程序在屏幕上显示的内容......

run:

I will read a text file then add it with user inputs in 
order to display and export a report detailing an event.

What is the single ticket price for the event? 25
What is the maximum number of donations expected for the event? 2

Please input the file location: event.txt
Reading data file....

Error code B-150: An error occured while attempting to add to the array.
Error code B-150: An error occured while attempting to add to the array.
The total amount of readable lines where 6 lines.


Where is the file for the report export? export.txt

Error code B-288: The file texport.txt could not be opened! The report 
cannot be generated.

Event Overall Outcome:

  Ticket Price           25.00

  Donation Analysis: 

  Profit/Loss Results: 
  26.0 Tickets sold 650.0
  1 Donations [500] +
                      --------
  Total Income           0.00
  Total Expenses       345.66 -
                      --------
  Event Losses       -345.66 


Would you like to run program again? [Y/N] - 

就像一个FYI,我的异常错误代码A是主类,B是第二个类,下面的数字是消息来自的代码行。我试图帮助我更快地找到我的位置......

我的目标是让显示器看起来像这样。

need to look like this.

2 个答案:

答案 0 :(得分:1)

你的主要问题在于你的第二堂课:

this.moneyDonated = new int[]{DONATION_ARRAY_SIZE};

这不会创建一个大小为DONATION_ARRAY_SIZE的数组。 正确的语法是:

this.moneyDonated = new int[DONATION_ARRAY_SIZE];

答案 1 :(得分:1)

上面有两个关键问题。首先是数组的大小。你应该有这样的东西:

  this.DONATION_ARRAY_SIZE = maxDonations;
  this.moneyDonated = new int[DONATION_ARRAY_SIZE];

其次,donationSuccess布尔值将初始化为false。你有这段代码:

        if (donationSuccess == false)    //checks if array is full
        {
            throw new ArrayIndexOutOfBoundsException ("Error code B-103: "
                    + "The array is full " + amount + " will not be stored"
                    + " in the array");
        }

您永远不会更改该donationSuccess值,因此即使不是这种情况,该代码块也会始终抛出该错误。您应该重新考虑初始化和设置donationSuccess值的方式。