Java: how do I group all Java dates in the corresponding week?
•
Java
Question:
I have many dates. I need to arrange them by week
Question: how do you group dates according to the dates in their week?
Sample dataset
Date date = new SimpleDateFormat.parse("04/01/2015")
Date date = new SimpleDateFormat.parse("04/02/2015")
Date date = new SimpleDateFormat.parse("04/03/2015")
Date date = new SimpleDateFormat.parse("04/04/2015")
Date date = new SimpleDateFormat.parse("04/05/2015")
Date date = new SimpleDateFormat.parse("04/06/2015")
Date date = new SimpleDateFormat.parse("04/07/2015")
Date date = new SimpleDateFormat.parse("04/08/2015")
Date date = new SimpleDateFormat.parse("04/09/2015")
Desired output
HashMap<Date,Date> hashMap = groupByWeek(ArrayList<Date> dates); printWeeklyGroupedDates(); Week 1: 04/01/2015 04/02/2015 04/03/2015 04/04/2015 04/05/2015 04/06/2015 04/07/2015 Week 2: 04/08/2015 04/09/2015
I tried
public Date getWhichYearlyWeek(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.get(Calendear.WEEK_OF_YEAR);
//Need to return this as 'Date' but indicate which week this is for the TreeMap functionality below
return cal.getTime();
}
public TreeMap<Date,ArrayList<Date>> getWeeklyMappedDates(ArrayList<Date> dateArray){
TreeMap<Date,ArrayList<Date>> treeMap = new TreeMap<Date,ArrayList<Date>>
for(Date i : dateArray){
Date date = getWhichYearlyWeek(date);
if(!treeMap.containsKey(date))
treeMap.get(date).add(date);
else
treeMap.put(date,new ArrayList<Date>());
}
return treeMap;
}
Solution
You only need to use a custom comparator to sort the date list The following example sorts dates by year and then by date. I don't know if you want the second part, but it's a good demonstration
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
public class Test {
public static void main(String[] args) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
List<Date> dates = new ArrayList<Date>(25);
dates.add(sdf.parse("04/01/2015"));
dates.add(sdf.parse("04/02/2015"));
dates.add(sdf.parse("04/03/2015"));
dates.add(sdf.parse("04/04/2015"));
dates.add(sdf.parse("04/05/2015"));
dates.add(sdf.parse("04/06/2015"));
dates.add(sdf.parse("04/07/2015"));
dates.add(sdf.parse("04/08/2015"));
dates.add(sdf.parse("04/09/2015"));
int week = 0;
int woy = -1;
Collections.sort(dates,new WeekComparator());
for (Date date : dates) {
if (woy != getWeekOfYear(date)) {
woy = getWeekOfYear(date);
week++;
System.out.println("Week " + week + ":");
}
System.out.println(date);
}
} catch (ParseException exp) {
exp.printStackTrace();
}
}
public static class WeekComparator implements Comparator<Date> {
@Override
public int compare(Date o1,Date o2) {
int result = getWeekOfYear(o1) - getWeekOfYear(o2);
if (result == 0) {
result = o1.compareTo(o2);
}
return result;
}
}
protected static int getWeekOfYear(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.WEEK_OF_YEAR);
}
}
Which output
Week 1: Wed Apr 01 00:00:00 EST 2015 Thu Apr 02 00:00:00 EST 2015 Fri Apr 03 00:00:00 EST 2015 Sat Apr 04 00:00:00 EST 2015 Week 2: Sun Apr 05 00:00:00 EST 2015 Mon Apr 06 00:00:00 EST 2015 Tue Apr 07 00:00:00 EST 2015 Wed Apr 08 00:00:00 EST 2015 Thu Apr 09 00:00:00 EST 2015
Java 8 Time API
Just because I need to practice
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
public class Test {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM/dd/yyyy");
List<LocalDate> dates = new ArrayList<LocalDate>(25);
dates.add(LocalDate.parse("04/01/2015",dtf));
dates.add(LocalDate.parse("04/02/2015",dtf));
dates.add(LocalDate.parse("04/03/2015",dtf));
dates.add(LocalDate.parse("04/04/2015",dtf));
dates.add(LocalDate.parse("04/05/2015",dtf));
dates.add(LocalDate.parse("04/06/2015",dtf));
dates.add(LocalDate.parse("04/07/2015",dtf));
dates.add(LocalDate.parse("04/08/2015",dtf));
dates.add(LocalDate.parse("04/09/2015",dtf));
int week = 0;
int woy = -1;
Collections.sort(dates,new WeekComparator());
for (LocalDate date : dates) {
if (woy != getWeekOfYear(date)) {
woy = getWeekOfYear(date);
week++;
System.out.println("Week " + week + ":");
}
System.out.println(date);
}
}
public static class WeekComparator implements Comparator<LocalDate> {
@Override
public int compare(LocalDate o1,LocalDate o2) {
int result = getWeekOfYear(o1) - getWeekOfYear(o2);
if (result == 0) {
result = o1.compareTo(o2);
}
return result;
}
}
protected static int getWeekOfYear(LocalDate date) {
WeekFields wf = WeekFields.of(Locale.getDefault());
return date.get(wf.weekOfYear());
}
}
Which output
Week 1: 2015-04-01 2015-04-02 2015-04-03 2015-04-04 Week 2: 2015-04-05 2015-04-06 2015-04-07 2015-04-08 2015-04-09
In either case, you can map each date to a map typed by week, but it's up to you
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
