问题描述
我有一个基于用户输入的价格创建文本文件并放置时间戳的类,然后可以在另一个类中读取文件。
我试图弄清楚如果价格与前一天相差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();
}
}
}