java 判断数组递增_关于Java:Java – 检查数组是否包含3个连续日期

嗨,我有一个字符串[]数组,其中包含格式为YYYY/MM/DD的日期。我想迭代此数组,看看数组中接下来的2个元素是否包含连续的日期。如果是这样,只需增加count变量。这是我到目前为止所拥有的。我基本上只需要有关检查是否有3个连续日期的if语句的帮助。

int count = 0;

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/18","2004/3/7"};

for(int i = 0; i < dates.length-2; i++){

//Help needed here! If i, i+1 and i+2 are consecutive...

if(...){

count++;

}

}

我意识到在比较之前,可能需要将字符串日期转换为实际日期对象。如有进一步指导,将不胜感激。谢谢

是的,将它们转换为Date实际上可以节省您大量的时间和工作。

你为什么不把日期放在一个文件里?来回转换有什么意义?

@克拉底鲁-因为我需要用它们的字符串表示另一种方法

@那么,为什么不在需要的时候将日期转换为字符串表示呢?

@i82much——不仅如此,它们还采用字符串格式,因为它们是直接从文本文件中读取的。

@马特:那又怎样?如果核心算法操作Date,那么在文本文件中读取时将其转换为Date,并且只在需要字符串时使用toString()或任何字符串转换。不需要时不要使事情复杂化。

你想重复2月18日的两次吗?那应该是18号和19号吗?

这个重复的问题有更多有趣的答案。

将String[]转换为Date[](即准备一个Date数组)。我想你已经知道怎么做了。

现在,您可以使用如下方法检查连续日期:

Calendar c = Calendar.getInstance();

int numConsecutive = 0;

Date last = null;

for (int i = 0; i < dates.length; i++) {

c.setTime(dates[i]);

c.add(Calendar.DATE, -1);

if (c.getTime().equals(last)) {

numConsecutive++;

} else {

numConsecutive = 0;

}

if (numConsecutive == 2) {

numConsecutive = 0;

count++;

}

last = dates[i];

}

DR

使用java.time.LocalDate类。

if ( z.minusDays ( 1 ).isEqual ( y ) && z.minusDays ( 2 ).isEqual ( x ) )  …

。使用java.time

现代方法使用java.time类,而不是麻烦的旧遗留类Date和Calendar。

首先将数组转换为LocalDate对象列表。我改变了您的示例数据,因为我认为您是指2月18日和19日,而不是重复18日两次。

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 );

}

循环LocalDate列表,记住前两项。如果当前日期和前两个日期都是连续日期,则递增计数器。

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 ;

}

转储到控制台。

System.out.println ("localdates:" + localdates );

System.out.println ("tripletCount:" + tripletCount );

System.out.println ("tripletDates:" + tripletDates );

localdates: [2004-01-23, 2004-01-24, 2004-01-25, 2004-01-26, 2004-01-29, 2004-02-11, 2004-02-17, 2004-02-18, 2004-02-19, 2004-03-07]

tripletCount: 3

tripletDates: [2004-01-25, 2004-01-26, 2004-02-19]

号关于java.time

JavaTimeFr框架是在Java 8和之后构建的。这些类取代了麻烦的旧遗留日期时间类,如java.util.Date、Calendar和SimpleDateFormat。

现在处于维护模式的joda time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规格为JSR 310。

在哪里获取java.time类?

Java SE 8、Java SE 9及以后

内置。

标准JAVA API的一部分与捆绑实现。

Java 9增加了一些次要的特性和修复。

Java SE 6和Java SE 7

大部分JavaTimeActudio都被移植到TealEnter后端的Java 6和7中。

安卓

threetenabp项目专门为Android调整threeten backport(如上所述)。

看看如何使用三连珠……

threeten额外项目使用额外的类扩展java.time。这个项目是将来可能添加到java.time的一个试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter等等。

@Test

public void threeConsecutiveDates() throws ParseException {

List consecutive = new ArrayList<>();

consecutive.add(new Date(0));

final SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");

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/18","2004/3/7"};

for (String s : dates) {

Date previous = consecutive.get(consecutive.size()-1);

Date current = format.parse(s);

if(previous.before(current) && (current.getTime()-previous.getTime() == 1000 * 60 * 60 * 24)) {

consecutive.add(current);

} else {

consecutive.clear();

consecutive.add(current);

}

if(consecutive.size() == 3) {

break;

}

}

System.out.println("consecutive =" + consecutive);

}

您好,您需要计算两个日期之间的秒数,然后转换为天数:

import java.util.*;

class DateDiff

{

public static void main(String [] args)

{

Calendar c1=Calendar.getInstance();

c1.set(2011,5, 29 );

Calendar c2=Calendar.getInstance();

c2.set(2012,5,30);

Date d1=c1.getTime();

Date d2=c2.getTime();

long diff=d2.getTime()-d1.getTime();

int noofdays=(int)(diff/(1000*24*60*60));

System.out.println(noofdays);

}

}

或者你可以看看在添加一天到c1之后,你是否得到c2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值