我得到的公交时刻表如1101011(从星期日到星期六,每周7天)
1表示 - 是的,公共汽车在该日运行
0表示 - 当天没有公共汽车没有运行
假设在某个特定日期09 - 10月,任何人都可以告诉如何查找公交车是否运行?
(我仍在努力寻找更好的方法。
答案 0 :(得分:1)
您可以将计划存储在数组中,然后根据星期几索引从中检索值。
private static final int[] SCHEDULE = new int[] {1, 0, 1, 0, 1, 1, 1};
public static void main(String[] args) {
LocalDate testDate = LocalDate.of(2016, Month.OCTOBER, 8);
System.out.println("testDate = " + testDate);
DayOfWeek dayOfWeek = testDate.getDayOfWeek();
System.out.println("Day of week = " + dayOfWeek);
System.out.println("The bus " + (1 == SCHEDULE[dayOfWeek.getValue()-1] ? "goes" : "does not go") + " on " + testDate);
}
请注意,由于DayOfWeek枚举的索引显示为
,因此我已将星期日的值在时间表中移至最后。int值遵循ISO-8601标准,从1(星期一)到7(星期日)。
答案 1 :(得分:1)
将输入字符串解析为EnumSet
DayOfWeek
常量,以表示总线运行的星期几。询问该集合是否包含任何特定日期的星期几。
Set<DayOfWeek> busRunDays = EnumSet. …
…
Boolean busRunsOn20161009 =
busRunDays.contains(
DayOfWeek.from( LocalDate.of( 2016 , Month.OCTOBER , 9 ) )
)
;
LocalDate
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DayOfWeek
Java包含DayOfWeek
枚举,将七个实例定义为常量,一个用于每周的每一天。
DayOfWeek dow = DayOfWeek.from( ld );
您可以测试是否相等。
if( dow.equals( DayOfWeek.TUESDAY ) ) …
根据ISO 8601标准,它们按星期一到星期日编号并按1-7排序。
EnumSet
EnumSet
类是Set
非常有效的实现,用于保存枚举定义的对象。在内部表示为位向量,EnumSet
占用的内存很少,执行速度非常快。
循环输入字符串字符,如果1
将该星期几添加到集合中。
Set<DayOfWeek> busRunDays = EnumSet.noneOf( DayOfWeek.class );
…
busRunDays.add( DayOfWeek.SUNDAY );
在您的代码的其他地方,您会询问一周中的某一天是否在该集合中。
if( busRunDays.contains( DayOfWeek.WEDNESDAY ) ) …
示例代码,全部放在一起并准备好运行(风险自负,无保证)。
Set<DayOfWeek> busRunDays = EnumSet.noneOf ( DayOfWeek.class );
String input = "1101011";
DayOfWeek[] inputWeek = { DayOfWeek.SUNDAY , DayOfWeek.MONDAY , DayOfWeek.TUESDAY , DayOfWeek.WEDNESDAY , DayOfWeek.THURSDAY , DayOfWeek.FRIDAY , DayOfWeek.SATURDAY }; // Define the ordering of days in a non-standard week.
int i = 0;
for ( char c : input.toCharArray () ) {
if ( c == '1' ) {
DayOfWeek dow = inputWeek[ i ];
busRunDays.add ( dow );
}
i = ( i + 1 ); // Prepare for next loop.
}
转储到控制台。
System.out.println ( "input: " + input + " | busRunDays: " + busRunDays );
输入:1101011 | busRunDays:[星期一,星期三,星期五,星期六,星期日]
如果您需要以1101011
格式写出字符串,则可以使用相同类型的逻辑。
测试公共汽车今天是否运行。
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Boolean busRunsToday = busRunDays.contains( DayOfWeek.from( today ) ) ;
测试公交车是否在特定日期运行。这专门回答了问题。
LocalDate ld = LocalDate.of( 2016 , Month.OCTOBER , 9 ) ;
Boolean busRunsOnDate = busRunDays.contains( DayOfWeek.from( ld ) ) ;
我强烈建议您养成传递这些DayOfWeek
和Set
个对象的习惯,而不是使用像1-7这样的数字和像1101011
这样的字符串。这样做可以提供type-safety,确保有效值,消除歧义,并使您的代码更加自我记录。
提示:如果您和您的用户像世界上许多人一样坚持标准的周一至周日周,那么生活会更容易。但我知道改变可能具有挑战性,特别是对美国人而言。因此,请务必在代码中仔细记录1101011
输入值使用非标准的Sun-Mon周。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:0)
使用队列怎么样?
提供每个数据(字符0或1)以及每天轮询数据并检查是否运行。
此外,您必须确定空队列的结果。
所以你可以像日常系统一样编码。