[英]Check times within an Array and Print the latest in a Time Range
提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文。
假设我有以下格式的数据列表:
ID#,YYYYMMDD HH:MM:SS.sss,score
所以数据可能是这样的:
501,20220104 13:12:07.005,25
501,20220104 13:12:07.002,25
500,20220106 09:04:10.013,10
501,20220104 13:12:07.001,25
501,20220104 13:12:07.003,25
501,20220104 13:12:07.004,25
501,20220104 15:20:50.011,25
我想在Java中编写以下程序:
20220104 13:12:07.001
) 的最早日期时间和 Arcade ID。我想我已经知道如何拆分数据了:
ArrayList<String> scoreData = new ArrayList<>(Arrays.asList(data.split(",")));
String arcadeID = scoreData.get(0);
Date dateTime = scoreData.get(1);
int score = scoreData.get(2);
然后如何将该数据传递给一个新数组,然后按降序对它进行排序:
Date[] scoresAbove20;
if (score > 20) {
scoresAbove20.push(dateTime);
Arrays.sort(scoresAbove20);
}
从scoresAbove20
数组中,我不确定如何:
定义一个class,具体是一条记录,代表每一行数据。
record Score( int id , LocalDateTime when , int score ) { }
切勿使用任何旧的Date
类。 对于日期时间处理,仅使用 JSR 310 中定义的现代java.time类。
定义一个格式化程序来解析您的日期时间字符串。
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuuMMdd HH:mm:ss.SSS" );
解析为LocalDateTime
object,一个带有时间但缺少时区上下文或与 UTC 的偏移量的日期。
在解析了三个输入字段中的每一个之后,实例化一条记录。
Score s = new Score( id , when , score );
将该 object 添加到列表中。
List < Score > scores = new ArrayList <>( lines.size() );
完成后,您应该有一个像这样的列表:
scores.toString() = [Score[id=501, when=2022-01-04T13:12:07.005, score=25], Score[id=501, when=2022-01-04T13:12:07.002, score= 25], 分数[id=500, when=2022-01-06T09:04:10.013, score=10], 分数[id=501, when=2022-01-04T13:12:07.001, score=25], 分数[id=501, when=2022-01-04T13:12:07.003, score=25], 得分[id=501, when=2022-01-04T13:12:07.004, score=25], 得分[id=501 , when=2022-01-04T15:20:50.011, score=25]]
String input =
"""
501,20220104 13:12:07.005,25
501,20220104 13:12:07.002,25
500,20220106 09:04:10.013,10
501,20220104 13:12:07.001,25
501,20220104 13:12:07.003,25
501,20220104 13:12:07.004,25
501,20220104 15:20:50.011,25
""";
List < String > lines = input.lines().toList();
record Score( int id , LocalDateTime when , int score ) { }
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuuMMdd HH:mm:ss.SSS" );
List < Score > scores = new ArrayList <>( lines.size() );
for ( String line : lines )
{
String[] fields = line.split( "," );
if ( fields.length != 3 ) { throw new IllegalStateException( "Did not find three fields." ); }
int id = Integer.parseInt( fields[ 0 ] );
LocalDateTime when = LocalDateTime.parse( fields[ 1 ] , formatter );
int score = Integer.parseInt( fields[ 2 ] );
Score s = new Score( id , when , score );
scores.add( s );
}
System.out.println( "scores = " + scores );
现在您有了一些可以应用业务逻辑的对象,如 1-2-3 项中所述。
我不会为你完成所有的作业,而且我可能做的太多了。 因此,我将为您提供执行该逻辑的关键点:要检查两分钟内有哪些项目,请使用LocalDateTime
方法isEqual
、 isBefore
、 isAfter
进行比较。
我建议使用半开放方法来定义时间跨度。 这意味着开始是包含的,而结束是排他的。 因此,您将检查乐谱的日期时间是否等于或晚于开始以及乐谱的日期时间是否早于结束。 提示:询问“等于或之后”的更简短方式是询问“不在之前”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.