【问题标题】:storing and retreiving data from an Array, export to text file从数组存储和检索数据,导出到文本文件
【发布时间】:2016-06-15 21:58:07
【问题描述】:

我是 java 新手,边走边学,我目前正在研究数组,我似乎不知道我在这里做错了什么。我不认为它以正确的方式提取数据,this program is suppose to read data from a text file, and ask the user for additional inputs, then display a report. 我似乎遇到了捐赠输出位的问题,因为我没有让它工作一次......程序剂量编译并运行,netbeans 说除了下面显示方法的禁用代码位之外,它都是绿色的。非常感谢任何建议、cmets 和正确方向的观点 =) 也可以使用一些建议来让文本文件输出和程序显示输出的小数位对齐。

主类

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] - 

仅供参考,对于我的异常错误代码 A 是主类,B 是第二类,后面的数字是消息来自的代码行。只是我试图帮助我更快地找到我的位置...

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

【问题讨论】:

  • 对于这里面临的实际问题,您的代码太多而信息太少。
  • 我的问题是我的捐赠数组没有将文本文件中的捐赠金额存储到数组中并正确显示
  • 在显示最低捐赠、平均捐赠、最高捐赠的金额以及显示文本文件和程序的输出时,我需要排列小数位时也有问题..
  • 在我看来这是一个花费更多精力并自己解决的问题。
  • @Theo 已经给了他答案,因为看起来语法确实不是他的强项..... :)

标签: java arrays oop fileoutputstream


【解决方案1】:

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

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

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

this.moneyDonated = new int[DONATION_ARRAY_SIZE];

【讨论】:

    【解决方案2】:

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

      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 值的方式。

    【讨论】:

    • 谢谢,我会考虑一下并尝试一下。我不一定要寻找问题的答案,只是朝着正确的方向前进,这给了我一个起点,谢谢=)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2013-01-30
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多