我有一个字符串数组,其中包含从CSV文件中读取的日期 现在我想计算该阵列中的周末天数。但是在我的数组中有一些日期是重复的。这里显示了我的数组中包含的部分数据。
2010/12/2
12/3/2010
12/5/2010
12/10/2010
12/5/2010
二○一○年十二月一十三日
12/14/2010
12/12/2010
在此数据集 12/5/2010是星期日(但有两条记录)& 12/12/2010是星期六(有一条记录)。在输出中,我想使用 java 打印此数组中的周末天数。与此示例相比, 答案应为2 。
FileInputStream fis=new FileInputStream("c:/cdr2.csv");
InputStreamReader isr=new InputStreamReader(fis);
BufferedReader bf = new BufferedReader(isr);
while (bf.ready()) {
String line = bf.readLine();
String[] values=line.split(",");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/d/yyyy");
Date date = simpleDateFormat.parse(values[2]);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
}
答案 0 :(得分:3)
首先,您需要编写一个方法来确定给定的Date
是否是周末:
public static boolean isWeekend(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
return dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY;
}
然后,您需要定义DateFormat
,以便将日期String
解析为java.util.Date
。最后,您可以使用Set
来确保您找到的每个周末都不会重复:
public static void main(String[] args) throws ParseException {
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
String[] dates = { "12/2/2010", "12/3/2010", "12/5/2010", "12/10/2010", "12/5/2010", "12/13/2010", "12/14/2010", "12/12/2010" };
Set<String> weekends = new HashSet<String>();
for (String dt : dates) {
Date date = dateFormat.parse(dt);
if (isWeekend(date)) {
weekends.add(dt);
}
}
System.out.println("There are " + weekends.size() + " distinct weekends."); // 2
}
答案 1 :(得分:1)
我会说你需要首先删除重复项,然后检查哪些是周末:
Set<String> set = new HashSet<String>( Arrays.asList(yourArrayOfDateStrings) );
DateFormat df = new SimpleDateFormat(yourDatePattern);
Calendar calendar = Calendar.getInstance();
int weekendDays = 0;
for (String dateString : set) {
calendar.setTime( df.parse(dateString) );
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
weekendDays++;
}
}
答案 2 :(得分:1)
我永远不会使用java日期! 我同意Costi Ciudatu,使用Set删除重复项。
:)请使用JodaTime
向您发送代码import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.DateTimeField;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
public class Dates
{
static String[] localTestDate = new String[] {"12/2/2010", "12/3/2010", "12/5/2010", "12/10/2010", "12/5/2010", "12/13/2010", "12/14/2010", "12/12/2010"};
static DateTimeFormatter dateFactory = DateTimeFormat.forPattern("MM/d/yyyy");
public static void main(String[] args)
{
// final Set<DateTime> uniqueDates = generateUniqueDates(localTestDate);
final Set<DateTime> uniqueDates = generateUniqueDates(readCommonSeparatedFile(args[0]));
int numberOfWeekendDates = 0;
for(DateTime date : uniqueDates)
{
if(isWeekend(date)) numberOfWeekendDates++;
}
System.out.println("There are " + numberOfWeekendDates + " weekend days in your list.");
}
private static boolean isWeekend(DateTime dateTime)
{
return (DateTimeConstants.SATURDAY == dateTime.dayOfWeek().get() || DateTimeConstants.SUNDAY == dateTime.dayOfWeek().get());
}
private static String[] readCommonSeparatedFile(final String fileName)
{
FileInputStream fileInputStream = null;
String[] result = null;
try
{
fileInputStream = new FileInputStream(fileName);
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
while (bufferedReader.ready())
{
String line = bufferedReader.readLine();
result = line.split(",");
}
}
catch (IOException e)
{
//log error some where
throw new RuntimeException("aw, snap!");
}
return result;
}
private static Set<DateTime> generateUniqueDates(final String[] dates)
{
final Set<DateTime> dateTimes = new HashSet<DateTime>();
for (String date : dates)
{
dateTimes.add(dateFactory.parseDateTime(date).toDateTime());
}
return dateTimes;
}
}