当前位置: 首页 > 知识库问答 >
问题:

如何创建库存,在动态数组中添加每个销售并计算总收入

江仲渊
2023-03-14

我是Java新手,我必须创建一个库存程序。该程序是:“一名销售人员在一个文本文件中输入他的销售额。每行包含以下内容(用分号分隔):

  • 客户名称(仅允许使用字母和空格)
  • 出售的设备(智能手机、平板电脑或笔记本电脑)
  • 价格(像这样##,#)
  • 销售日期(年月日,例如21/03/21)

然后创建一个执行以下操作的程序:-从用户读取文件名并将其打开。对于文件不存在的情况,使用适当的例外,并要求用户再次输入文件名

- 创建一个名为“Sale”的类,该类可以在其每个对象中存储销售(名称,设备,价格和日期,如上所述)。对于设备类型,请使用ENUM,对于日期,创建一个名为“LocalDate”的类

-从文本文件中读取数据并将它们放入“Sale”对象的动态数组中

-计算并打印每种设备类型的总销售收入”

到目前为止,我有这个:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.ArrayList;

public class Files {
    public static void main(String[] args)  {
        Scanner in = new Scanner(System.in);
        System.out.println("What is the filename?");
        String input = in.nextLine();
        File file = new File(input);


        if(file.exists()){
            System.out.println("The file exists. ");
        }else {
            File file2;
            do {
                System.out.println("That file does not exist. Please enter the name again. ");
                Scanner in2 = new Scanner(System.in);
                String input2 = in2.nextLine();
                file2 = new File(input2);
                if (file2.exists()) {
                    System.out.println("The file exists. ");
                }
            } while (!file.exists() && !file2.exists());
        }

        ArrayList<String> sales = new ArrayList<>();

        try(BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\Katerina Efstathiou\\Desktop\\JAVA (1) - Files and exceptions\\javaprogrone.txt"))){
            String line;

            while ((line = br.readLine()) != null)
                //Add the line to the array-list:
                sales.add(line);

        }catch(IOException e){
            e.printStackTrace();
        }

        int listSize = sales.size();  //variable with the size of the list 'sales'

        String[] listOfPrices = new String[listSize];  //define an array of the size of the list

    }
}

“销售”类:

public class Sale {
    private String customerName;  //variables are declared as private

    //enum class DeviceType - (enum classes represent a group of constants, like final variables)
    //Enum is short for "enumerations", which means "specifically listed"
    enum DeviceType{
        SMARTPHONE,
        TABLET,
        LAPTOP
    }

    private double price;  //variables are declared as private

    public Sale(String firstName, String lastName){  //constructor of Sale class
        customerName = firstName+" "+lastName;
        price = 0.0;
    }

    //subclass LocalDate is static ,so I can access it without creating an object of the Sale class
    static class LocalDate{
        private int Day;
        private int Month;
        private int Year;

        LocalDate(){
            Day=0;
            Month=0;
            Year=0;
        }

        public void Date(){
            System.out.println(Day+"/"+Month+"/"+Year);
        }

    }
}

这是我制作的文件:

销售文件

因此,我的问题是如何将每个对象添加到数组中,以及如何计算每个设备的销售收入?(这意味着如果我卖出4部智能手机,这4部智能电话的总收入是多少?)。

我真的很绝望...我不知道还能做什么,我真的需要帮助...

共有1个答案

百里骏
2023-03-14

了解到您正在学习Java,我已经尽可能简单,并更新了您的代码并指出了错误。

让我们一步一步来。

1: 分离组件

DeviceType枚举和LocalDate类

public enum DeviceType {
        SMARTPHONE,
        TABLET,
        LAPTOP;
    }
public class LocalDate {
        private int day;
        private int month;
        private int year;

        public static LocalDate date(String date) {
            final String[] path = date.split("/");
            final LocalDate result = new LocalDate();
            result.day = Integer.parseInt(path[0]);
            result.month = Integer.parseInt(path[1]);
            result.year = Integer.parseInt(path[2]);
            return result;
        }
    }

请注意我如何为 DeviceType 创建单独的枚举(而不是子枚举)。在我们的销售类中,我们将只对上述组件使用 hasA 关系。

此外,在date方法中,我已经更新了逻辑,可以根据输入返回LocalDate类的实例。

2: 使用组件

public class Sale {
        private final String customerName;
        private final double price;
        private final DeviceType deviceType;
        private final LocalDate date;

        public Sale(String firstName, String lastName, final String device, final String cost, final String date) {  //constructor of Sale class
            customerName = firstName + " " + lastName;
            price = Double.parseDouble(cost);
            deviceType = DeviceType.valueOf(device);
            this.date = LocalDate.date(date);
        }

        public DeviceType getDeviceType() {
            return deviceType;
        }
        
        public double getPrice() {
            return price;
        }

        public LocalDate getDate() {
            return date;
        }

        public String getCustomerName() {
            return customerName;
        }
    }

在这一步中,我们使用提供给我们的输入来构建我们的销售类。我们将利用上面创建的组件。

3:获得结果

List<Sale> sales = new ArrayList<>();

        try (BufferedReader br = new BufferedReader(new FileReader(file.getAbsolutePath()))) {
            String line;

            while ((line = br.readLine()) != null) {
                //Add the line to the array-list:
                final String[] parts = line.split(";");
                final String[] cost = parts[2].split(",");
                final String[] names = parts[0].split(" ");
                final String firstName = names[0].trim();
                final String lastName = names[1].trim();
                final String costInteger = cost[0].trim();
                final String costDecimal = cost[1].trim();
                final String device = parts[1].trim();
                final String date = parts[3].trim();
                final Sale sale = new Sale(firstName, lastName, device, costInteger + "." + costDecimal, date);
                sales.add(sale);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        final DeviceType[] deviceTypes = DeviceType.values();
        for (final DeviceType deviceType : deviceTypes) {
            double sum = 0;
            for (final Sale sale : sales) {
                if (sale.getDeviceType().name().equals(deviceType.name())) {
                    sum += sale.getPrice();
                }
            }
            System.out.println("Income for device " + deviceType.name() + " is " + sum);
        }

而不是创建 ArrayList sales = new ArrayList

并且为了读取文件名,请使用您在上面的代码中创建的文件对象。

一旦,我们所有的事情都设置好了,我们将尝试找到销售列表中所有可用设备类型的总和。

 类似资料:
  • 问题内容: 如何在类内创建和实例化jpa存储库?我处于一种情况,必须为通用类中的不同实体创建存储库。 对于Neo4j存储库,我可以轻松地做到这一点,例如, 对于JpaRepository,我检查了文档并发现了这一点, 我不确定如何在以上代码中实例化工厂。 还不能通过指定域类来像创建Neo4j一样创建存储库吗? 问题答案: 我终于以这种方式工作了, 通过SimpleJpaRepository,我可以

  • 如何在一个类中创建和实例化jpa存储库?我现在的情况是,我必须在一个泛型类中为不同的实体创建存储库。 我可以很容易地为Neo4j存储库这样做, 对于JpaRepostory,我检查了留档,发现了这个, 我不确定如何在上面的代码中实例化工厂。 另外,我不能像为Neo4j那样通过指定域类来创建存储库吗?

  • 问题内容: 在我的数据库中,我有一个包含两列的表。第一列包含日期,第二列是计数变量。我想知道是否有可能根据日期和计数来计算每个工作日的平均计数。在下面的一个小例子中: 桌子: 输出: 问题答案: 您可以对表达式进行一系列调用以提取当天的名称: 编辑: 鉴于编辑后的帖子中已更新了预期的输出,因此操作起来容易得多-只需按:分组即可:

  • 问题内容: 我正在尝试计算一个月内某个产品的总销售额,但是我希望它包括所有“空”月(无销售),并且只选择最近的12个月。 到目前为止,这是我的代码。 这返回 但我希望它能回来。 我正在使用SQL Server 2008 R2 Sp1 问题答案: 在知道您有日历表之前,我已经做完了。我已经习惯了连续十二个月(包括当前)。

  • 我用的是Jooq3.10。我想为每个选择、更新和删除查询添加具有动态值的默认条件。 例1: 我如何做到这一点?