问题:
我有很多日期,我需要按周安排.
题:
如何按照他们所在的一周中的日期对日期进行分组?
示例数据集
- 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")
期望的输出
- 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
我试过的
- 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;
- }
解决方法
您只需使用自定义Comparator对日期列表进行排序即可.下面的例子按年份排序日期,然后按日期排序,不知道你是否想要第二部分,但这是一个很好的演示……
- 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);
- }
- }
哪个输出
- 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
仅仅因为我需要练习……
- 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());
- }
- }
哪个输出
- 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
在任何一种情况下,您都可以将每个日期映射到按周键入的地图,但这取决于您