我的任务是用Java创建约会计划程序。我已经完成了所有工作,但我无法按日期对新约会的日期进行排序。
我尝试过更改顺序,但是无论如何我都无法按日期正确排序新约会。
{"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
int ind1 = 0,ind2 = 0;
for(int i=0;i<12;i++) {
if(monthArray[i].equalsIgnoreCase(month)) {
ind1=i;
}
if(monthArray[i].equalsIgnoreCase(app.getMonth())) {
ind2=i;
}
}
if(ind1<ind2) {
return 1;
}
else if(ind1==ind2) {
if(this.day<app.getDay()) {
return 1;
}
else if(this.getDay()>app.getDay()) {
return -1;
}
else {
if(this.getHour()<app.getHour()) {
return 1;
}
else if(this.getHour()>app.getHour()) {
return -1;
}
else {
if(this.getMin()<app.getMin()) {
return 1;
}
else if(this.getMin()>app.getMin()) {
return -1;
}
else {
return 0;
}
}
}
}
else {
return -1;
}
}
}
我希望新约会按日期排序,但不会。
答案 0 :(得分:1)
一个适当的任命系统必须考虑到以下事实:世界各地的政客都倾向于重新定义其管辖下的时区。他们经常这样做,而且很少或没有警告。
因此您的Appointment
类应包含两个成员字段:
LocalDateTime
保存日期和时间。请注意,这不是 not 代表时刻,还是 not 在时间轴上的一点。如果它在明年1月23日的下午3点保持不变,我们不知道这是否意味着在东京,加尔各答,巴黎或蒙特利尔的下午3点-所有不同的时刻,相隔几个小时。 ZoneId
表示我们打算在下午3点进行约会的时区。 示例:
LocalDate ld = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 15 , 0 ) ;
this.localDateTime = LocalDateTime.of( ld , lt ) ;
this.zoneId = ZoneId.of( "America/Los_Angeles" ) ;
出于排序目的,您的类可以使用所需的Comparable
方法来实现compareTo
接口。
诀窍是,例如,您希望在美国东海岸的下午3点约会排在几个小时后发生的西海岸的下午3点约会之上。
因此compareTo
方法必须动态计算时刻,确定时间轴上的特定点。然后,比较各种Appointment
对象的矩以进行正确排序。
第一步是确保您的JVM已更新有关时区的最新规则。请记住,如上所述,这些更改经常发生。对Java的更新通常会包括对“ tzdata”区域信息的更新。如果您关心的时区最近才更改,则可能需要自己更新 tzdata 。
下一步是将区域动态应用于日期时间以确定时刻。将ZoneId
应用于LocalDateTime
以得到ZonedDateTime
。
ZonedDateTime zdt = this.localDateTime.atZone( this.zoneId ) ;
将其调整为UTC。根据定义,始终以UTC提取Instant
对象。
Instant thisInstant = zdt.toInstant() ;
将此Instant
对象的Appointment
与传递给您的compareTo
的另一个对象进行比较。我们可以依次调用Instant::compareTo
方法来进行实际比较。
return thisInstant.compareTo( other.localDateTime.atZone( other.zoneId ).toInstant() ) ;
或者,您可以选择使用Objects.compare
。
答案 1 :(得分:0)
Java有一个DateTime
库,该库可能会非常有帮助,但是我假设您不希望在手动执行该操作时看到该视图。
https://dzone.com/articles/java-comparable-interface-in-five-minutes
我建议您阅读类似的内容,从而提供有关可比产品的一些信息。这样,您就可以创建一个正在做的方法,将两个对象相互比较。然后,您可以使用许多标准解决方案,例如Collections.sort
,以便更轻松地测试和使用代码。
我不确定那是否就是你已经在做的,所以我想我会把它扔在那里。
但是对于实际问题,最好的解决方案是使用内置函数足够有趣。
Integer.compareTo(int a, int b)
将为您比较两个整数。您要做的就是反复比较整数。您可以像这样运行代码
int comp = Integer.compare(monthA, monthB;
if(comp != 0) return comp;
//proceed with rest of comparisons the same way you did the months
答案 2 :(得分:0)
如果您要获取约会日期,那为什么不直接比较而不是比较月份,日期和时间呢?
尽管您可以简单地将约会日期转换为有效日期对象,如下所示。
String sDate1="31/12/1998";
Date date1=new SimpleDateFormat("dd/MM/yyyy").parse(sDate1);
System.out.println(sDate1+"\t"+date1);
参考链接:https://www.javatpoint.com/java-string-to-date
然后只需比较日期对象
if (date1.compareTo(date2) > 0) {
some opertaion...
}
参考链接:https://www.mkyong.com/java/how-to-compare-dates-in-java/
希望这会对您有所帮助。