我有一个输入表单,用户每天用当前日期填写表单。现在,我需要显示用户未在表单中输入的日期。
我已经检索了输入的日期和该月的天数。我不知道如何比较这两个值和打印未输入的日期。
基本上,您将希望从每个月的第一天开始,并为每个月的每一天创建一个DateTime值。将这些日期中的每一天与当月输入的所有值进行比较,如果没有匹配,则输出生成的DateTime。这是一个基本的算法;您可以根据需要对其进行修改,以涵盖所需的日期范围:
//I leave you the exercise of actually getting the entered dates in DateTime format
List<DateTime> enteredDates = GetEnteredDatesAsDateTimes();
var unenteredDates = new List<DateTime>();
//I assume you want days for the current month;
//if not you can set up a DateTime using a specified month/year
var today = DateTime.Today;
var dateToCheck = new DateTime(today.Year, today.Month, 1);
//You could also make sure the date is less than the current date,
//or less than a specified "end date".
while (dateToCheck.Month == today.Month)
{
//uses Linq, which requires .NET 3.5
if(!enteredDates.Any(d=>d.Date == dateToCheck.Date))
unenteredDates.Add(dateToCheck);
//use the below code instead for .NET 2.0
//bool inList = false;
//foreach(var date in enteredDates)
// if(enteredDate.Date == date.Date)
// {
// inList = true;
// break;
// }
//if(!inList) unenteredDates.Add(dateToCheck);
dateToCheck = dateToCheck.AddDays(1);
}
//unenteredDates now has all the dates for which the user didn't fill out the form.
理解这是一个N^2复杂度的算法;将一个列表中的每个元素与另一个列表中的每个元素进行比较,期望这两个列表的基数大致相等。它应该不会表现得很糟糕,只要你没有检查几个月的日期。您可以通过对输入日期的列表进行排序,然后对日期执行二进制搜索,而不是线性搜索,将其减少到NlogN。这增加了您需要编写的代码,但减少了代码需要执行的步骤。
如果您能够跟踪表单填写的日期。你所要做的就是用当前月份的长度写一个循环。
此时,您所要做的就是简单检查当前迭代是否存在于您的日期集合中。如果日期不包含在集合中,则打印结果。
System.DateTime。DaysInMonth(int year, int month)将决定循环应该有多少次迭代。
你所要做的就是提取当前的:月份和年份
我能想到的最简单的方法是打印一年中所有的日期,跳过表单中已输入的任何日期。例如:
for(int i=1;i<13;i++){
String month = Integer.toString(i);
for(int j=1;j<32;j++){
String date = month+"/"+Integer.toString(j);
if (date in listOfValidDates):
if(date in filedDates):
continue;
System.out.println(date)
}
}
update:将示例从伪代码更改为java,因为我知道这是与c#最相似的语言。