Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 转换列表<;日期>;映射<;月份,列表<;日期>&燃气轮机;_Java - Fatal编程技术网

Java 转换列表<;日期>;映射<;月份,列表<;日期>&燃气轮机;

Java 转换列表<;日期>;映射<;月份,列表<;日期>&燃气轮机;,java,Java,我想将日期列表转换为一个映射,其中月份是键,值是给定月份的日期列表 我有一个month对象,它基本上包含一个月和一年int,因此每个月都是唯一的 public class Month implements Serializable, Comparable<Month> { protected int year; protected int month; public Month(Date dag) { C

我想将日期列表转换为一个映射,其中月份是键,值是给定月份的日期列表

我有一个month对象,它基本上包含一个月和一年int,因此每个月都是唯一的

    public class Month implements Serializable, Comparable<Month> {
        protected int year;
        protected int month;

       public Month(Date dag) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(dag);
            this.month = cal.get(Calendar.MONTH)+1; //zerobased to onebased
            this.year = cal.get(Calendar.YEAR);
        }

    }
公共类月实现可序列化、可比较{
保护国际年;
保护整数月;
公共月(日期dag){
Calendar cal=Calendar.getInstance();
校准设定时间(dag);
this.month=cal.get(Calendar.month)+1;//zerobased到onebased
this.year=cal.get(日历年);
}
}
现在给出一个日期列表,我试着这样做:

     public void addLedigeDage(List<Date> newLedigeDage) {
        List<Date> datesPerMonth = new ArrayList<>();
        Calendar cal = Calendar.getInstance();
            for (Date date : newLedigeDage) {
                cal.setTime(date);
                Month month = new Month(date);
                datesPerMonth = findAllDatesForGivenMonth(newLedigeDage, cal.get(Calendar.MONTH));
                ledigeDageMap.put(month, datesPerMonth);
            }
        }


    private List<Date> findAllDatesForGivenMonth(List<Date> newLedigeDage, int month) {
        Calendar cal = Calendar.getInstance();
        List<Date> datesForGivenMonth = new ArrayList<>();
        for (Date date : newLedigeDage) {
            if (cal.get(Calendar.MONTH) == month ) {
                datesForGivenMonth.add(date);
            }
        }
        return datesForGivenMonth;
    }
public void addLedigeDage(列出newLedigeDage){
List datespermonh=new ArrayList();
Calendar cal=Calendar.getInstance();
用于(日期:newLedigeDage){
校准设定时间(日期);
月份=新月份(日期);
datesPerMonth=findAllDatesForGivenMonth(newLedigeDage,cal.get(Calendar.MONTH));
ledigeDageMap.put(月、日、月);
}
}
私人列表findAllDatesForGivenMonth(列表newLedigeDage,整数月){
Calendar cal=Calendar.getInstance();
List datesForGivenMonth=new ArrayList();
用于(日期:newLedigeDage){
如果(计算获取(日历月)=月){
datesForGivenMonth.添加(日期);
}
}
返回日期至第七个月;
}
但是代码并不干净,也不是最优的,因为我在相同的日期上迭代了太多次

我用的是Java1.7,有番石榴。在这种情况下,我不能使用多重映射,因为我的应用程序中存在一些架构问题


关于如何优化它并使其干净,有什么建议吗?

我想我会做如下事情:

public void addLedigeDage(List<Date> newLedigeDage) {
  for (Date date : newLedigeDage) {
    Month month = new Month(date);
    if (!ledigeDageMap.containsKey(month)) {
      ledigeDageMap.put(month, new ArrayList<>());
    }
    ledigeDageMap.get(month).add(date);
  }
}
public void addLedigeDage(列出newLedigeDage){
用于(日期:newLedigeDage){
月份=新月份(日期);
如果(!ledigeDageMap.containsKey(月)){
ledigeDageMap.put(月,新ArrayList());
}
ledigeDageMap.get(月).add(日期);
}
}
如果需要,您可以提取:

if (!ledigeDageMap.containsKey(month)) {
  ledigeDageMap.put(month, new ArrayList<>());
}
ledigeDageMap.get(month).add(date);
if(!ledigeDageMap.containsKey(月)){
ledigeDageMap.put(月,新ArrayList());
}
ledigeDageMap.get(月).add(日期);

作为一种单独的方法,称之为类似于
addDateToMap
的方法,它更简洁。

有一个优雅的Java-8解决方案:

    List<Date> dates = Arrays.asList(new Date(10000), new Date(100000));
    Map<Month, List<Date>> byMonth = dates.stream()
            .collect(Collectors.groupingBy(d -> new Month(d)));
List dates=Arrays.asList(新日期(10000)、新日期(100000));
Map byMonth=dates.stream()
.collect(Collectors.groupingBy(d->newmonth(d));

您的代码有几个问题: 第一:不要在代码中撒谎(月份包含月份和年份)。应该是更具体的名字

第二:覆盖等于和hashcode方法其他具有相同月份和年份值的wise两个月对象将被Map视为不同的对象


除此之外,DaveyDaveDaveDave的答案还不错。

您想查看代码吗?>>不,我不想要代码检查。我正在寻找正确的干净方法来做这件事,我刚刚发布了我到目前为止所做的尝试。你希望有人检查一下,并提出更好的解决方案。这是“代码审查”的目标之一。“有没有关于如何优化它并使其干净的建议?”。所以评论。。。AFAIK是一个很好的问题的一部分,所以是“你尝试了什么”和“发布你的代码”。如果我用错误的方式提出这个问题,我很抱歉。如果我在没有提交代码的情况下问这个问题,会有什么不同吗?但是谢谢你的时间,我将在stack exchange上发布相同的问题。我不知道番石榴,但我怀疑你可能能够通过番石榴魔术来批准上面的内容。Month已经有一个equals和hashcode方法,我选择不在这个问题中发布,因为它们对这个问题没有任何价值(Getter和Setter也是如此). 另外,我自己也没有编写Month类,我只是在使用现有代码,在这个迭代中我无法重构这些代码。另外,基于final将字段作为hashCode也是一个很好的实践。