【问题标题】:Java - How to detect the number of lines in the text file and do calculationsJava - 如何检测文本文件中的行数并进行计算
【发布时间】:2017-11-07 15:22:11
【问题描述】:

我有一个名为SalesData.txt 的文件,其中包含一家零售店连续数周每天的销售额。文件中的每一行包含七个数字,它们是一周的每日销售额。数字用逗号分隔。以下是文件中的示例:

1245.67,1490.07,1679.87,2371.46,1783.92,1461.99,2059.77
2541.36,2965.88,1965.32,1845.23,7021.11,9652.74,1469.36
2513.45,1963.22,1568.35,1966.35,1893.25,1025.36,1128.36

我已将 String 转换为 Double 并尝试计算:

  • 每周总销售额
  • 每周平均日销售额
  • 所有周的总销售额
  • 平均每周销售额

我的问题是 Java 如何将第一行检测为第 1 周,将第二行检测为第 2 周等。并计算数量。下面是语法:

import java.io.*;
import java.util.*;
import java.lang.*;

public class Q1
{
    public static void main (String [] args) throws IOException,  NumberFormatException
    {
        //Open the text file
        File file = new File("SalesData.txt");
        Scanner inputFile = new Scanner (file);

        //Read the text file
        while (inputFile.hasNext())
        {
            String weekly_Sale = inputFile.nextLine();
            String value = weekly_Sale;

            //Split the text by ","
            StringTokenizer strtk = new StringTokenizer(value, ",");

            //Define array list
            ArrayList<String> numList = new ArrayList<String> ();
            while (strtk.hasMoreTokens ())
            {
                numList.add(strtk.nextToken());
            }

            //Change the data type from String to Double
            for (String item:numList)
            {
                Double result = Double.parseDouble(item);
                //System.out.println(result);
            }
            weekly(result);

        }
        //Close the text file
        inputFile.close();
    }
    // not sure how to detect the week number
    public static void weekly(String numList)
    {
        for (int i=0; i<numList.size; i++)
        {

            System.out.println(numList.get(i));
        }
    }
}

【问题讨论】:

  • 有什么问题?如果您逐行阅读,则周将由 \n 分隔,因此您将在 while 循环的每次迭代中再处理一周。不知道你问什么。
  • 每一行代表一周,那么如何从文件中获取周数?
  • while 循环中的计数器如何在您每次读取一行时递增?
  • @BonnieWong 好吧,你可以用计数器来计算你的行数:int counter = 0 在 while 循环之前,counter++; 在你的循环中。然后counter+1 也将是您当前工作的周数。
  • 将读取的每一行传递到一个列表中。列表中每一行的索引将代表星期。

标签: java arraylist


【解决方案1】:

这听起来像是一个列表列表,其中内部列表代表特定周的销售额,外部列表代表所有周:

List<List<Double>> saleWeeks;

解析文件时,每一行代表一周,所以添加一个新列表:

List<Double> salesForTheWeek = new ArrayList<>();
saleWeeks.add(salesForTheWeek);
// parse the line of the file and add the values to salesForTheWeek

以后,每周都与索引有关:

List<Double> week1Sales = saleWeeks.get(0);

然后您可以迭代(或流式传输)以添加、平均等。

【讨论】:

    【解决方案2】:

    创建一个 WeeklySales 类,它将封装以下属性:

    每周的总销售额 每周日均销售额

    为每一行计算“每周的总销售额”和“ 每周平均每日销售额”并填充在 WeeklySales 类列表中。

    使用 WeeklySales 类的列表计算如下:

    所有周的总销售额 平均每周销售额

    创建另一个类来保存以上两个属性和对象列表并使用它。

    在一次迭代中,还可以填充包含所需属性的模型。

    【讨论】:

      【解决方案3】:

      我将为您提供阅读值的部分,因为这是您“必须知道如何做”的部分。你必须自己做剩下的事情,因为这对我来说听起来很像家庭作业;)

      您可以逐行读取您的文件(外循环)并迭代在字符','(内循环)上分割的每一行中的值。 lineIndex 将始终告诉您正在查看的周值。

      try (BufferedReader br = new BufferedReader(new FileReader(file))) {
          int lineIndex = 0;
          String line;
          while ((line = br.readLine()) != null) {
              String[] values = line.split(",");
              for (int i = 0; i < values.length; i++) {
                  double value = Double.valueOf(values[i]);
                  // do stuff with your number
              }
              lineIndex++;
          }
      }
      

      关于我们在这里所做的更深入的解释:我们使用 try-with 资源块,因为它确保即使抛出 Exception 也会关闭阅读器。我们的BufferedReader(通过FileReader)每次调用br.readLine() 时都会读取文件。这是包含由, 分隔的所有值的行。因此,我们将split()String 转换为Strings 数组,并将每个String 转换为Double.valueOf()

      【讨论】:

        【解决方案4】:

        您可以使用由文件行组成的 Java 8 Stream 来完成您的任务。

        使用Files.lines方法获取Stream。

        Stream<String> lines = Files.lines(Paths.get(yourFileName));
        //To obtain the number of weeks
        long numberOfWeeks = lines.count();
        

        或者要获得每周的总和,请尝试以下方式:

        List<Double> weekSums = lines.map(line -> {
                    List<String> asList = Arrays.asList(line.split(","));
                    return asList.stream().mapToDouble(Double::parseDouble).sum();
                }).collect(Collectors.toList());
        

        有了这个总和列表,您可以继续计算平均值等。

        double sumOfAllWeeks = weekSums.stream().mapToDouble(Double::doubleValue).sum();
        Double allWeeksAverage = weekSums.stream().collect(Collectors.averagingDouble(d -> d));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-29
          • 1970-01-01
          • 2016-10-28
          相关资源
          最近更新 更多