最近有个需求,判断某个人在一段时间内是否有连续打卡,以及连续打卡大于几天,对于这个问题我当时的思路大致是把日期排序后转化为数字或者转化为天数(或秒数),遍历后逐个相减,若中间差有大于1的说明没有连续,并计算之前的连续为1的时间组,但这会产生一个问题,首先是隔月隔年打卡的问题,其次中间会隐藏潜在的逻辑,需要从中梳理,大致写完以后想看看其他高手们更简单的方法,以便学习运用:
java.time.LocalDate看到这个类,其实用的比较多但是了解的还是挺少的,果然还是涨了见识、
首先将数组转换为LocalDate对象列表。
String[] dates = {
"2004/1/23" ,"2004/1/24" ,"2004/1/25" ,
"2004/1/26" ,"2004/1/29" ,"2004/2/11" ,
"2004/2/17" ,"2004/2/18" ,"2004/2/19" ,"2004/3/7" };
DateTimeFormatter f = DateTimeFormatter.ofPattern ("uuuu/M/d" );
List < LocalDate > localdates = new ArrayList <> ( dates.length );
for ( String input : dates ) {
LocalDate ld = LocalDate.parse ( input, f );
localdates.add ( ld );
}
Integer tripletCount = 0;
List< LocalDate > tripletDates = new ArrayList<>();
LocalDate x = null;
LocalDate y = null;
for ( LocalDate z : localdates ) {
if ( null == x ) { x = z; continue; }
if ( null == y ) { y = z; continue; }
if ( z.minusDays ( 1 ).isEqual ( y ) && z.minusDays ( 2 ).isEqual ( x ) ) {
tripletCount= ( tripletCount + 1 );
tripletDates.add( z );
}
// Prepare for next loop.
x = y ;
y = z ;
}
tripletCount可以根据自己的需要来变换数据,逻辑清晰,代码简单明了,但是根据实际使用情况,本人的对部分细节做了修改,使其在此基础上判断连续日期更加合理化和实用化,其中考虑了几个问题。
首先,一般传入的日期是连续递增,但也有可能逐渐递减。
其次,增加扩展性。判断连续三次只是一个简单的需求,其后续可能会使用该代码做多次连续判断,此项须实现。
改造后的代码逻辑之后附上