如何根据扫描文件中的用户输入显示消息

问题描述

我有一个基于用户输入的价格创建文本文件并放置时间戳的类,然后可以在另一个类中读取文件

我试图弄清楚如果价格与前一天相差10%或更多,该如何打印消息。基本上,我如何从文本文件获取信息并找出价格是否在两天内同时发生10%的变化,因此第一天为下午12点,第二天为下午12点。

例如,如果星期二上午11点的值为50,而星期三上午的值为60,则应打印“ 11点的价格大于10%”

这是用于创建文件代码

class Main{  
    public static void main(String args[]){  
        Scanner scan = new Scanner(system.in);
        System.out.println("Price: ");
        float price = scan.nextInt();
        System.out.println( "Price:" + " " + price);
        LocalDateTime dateTime = LocalDateTime.Now(); 
        DateTimeFormatter formatDT = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
        String formattedDT = dateTime.format(formatDT);
        scan.close();

        try(FileWriter fw = new FileWriter("price.txt",true);
        BufferedWriter bw = new BufferedWriter(fw);
        PrintWriter out = new PrintWriter(bw))
        {
            out.println(price + " " + formattedDT);
        } catch (IOException e) {
            e.printstacktrace();
        }
    }  
}

price.txt看起来像这样:

50 29-09-2020 11:49:54
55 29-09-2020 12:54:41
60 29-09-2020 13:08:16
58 29-09-2020 14:08:21
...
60 30-09-2020 11:29:34
56 30-09-2020 12:34:21
60.3 30-09-2020 13:48:36
58.1 30-09-2020 14:18:11

这是我读取price.txt文件的方式:

public class ReadFile {
    public static void main(String[] args) {
        try {
            File readFile = new File("price.txt");
            Scanner fileReader = new Scanner(readFile);
            while (fileReader.hasNextLine()) {
                String fileContent = fileReader.nextLine();
                System.out.println(fileContent);

            }
            fileReader.close();
        } catch (FileNotFoundException e) {
            System.out.println("file was not found");
            e.printstacktrace();
        }
    }
}

非常感谢!

解决方法

使用

  • Files.lines(...)用于逐行读取文件
  • Stream<String>用于遍历各行
  • String.split(...)将每一行划分为价格和时间部分
  • LocalDateTime.parse(...)将时间部分转换为LocalDateTime
  • 2 x 24矩阵Double[][],用于缓冲两天的每小时价格
  • 模运算符%用于在偶数天和奇数天之间切换。

查看此实现:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;

public class ReadFile {
    
    private static final DateTimeFormatter format =
            DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");

    public static void main(String[] args) {
        Double[][] prices = new Double[2][24];
        AtomicInteger prevLineDayIdx = new AtomicInteger(-1);
        try (Stream<String> stream = Files.lines(Paths.get("price.txt"))) {
                stream.forEach(line -> {
                String[] ary = line.split(" ",2);
                Double price = Double.parseDouble(ary[0]);
                LocalDateTime timestamp = LocalDateTime.parse(ary[1],format);
                int dayIdx = (int) timestamp.toLocalDate().toEpochDay();
                int timeIdx = timestamp.getHour();
                if (dayIdx != prevLineDayIdx.get()) {  // Clear price buffer for 
                    if (prevLineDayIdx.get() != -1) {  // supporting line step > 1 days
                        for(int idx = prevLineDayIdx.get(); idx < dayIdx - 1; idx ++) {
                            prices[idx%2] = new Double[24];
                        }
                    }
                    prevLineDayIdx.set(dayIdx);
                }
                Double previousPrice = prices[(dayIdx - 1)%2][timeIdx];
                if (previousPrice != null &&
                        Math.abs(previousPrice - price)/previousPrice >= 0.1d) {
                    System.out.println("The price " + price + " on " + 
                            format.format(timestamp) + 
                            " differs 10% or more from the price " + 
                            previousPrice + 
                            " at the same time yesterday."); 
                }
                prices[dayIdx%2][timeIdx] = price;
            });
        } catch (IOException e) {
            e.printStackTrace();
        }        
    }

}