繁体   English   中英

如何使用Java根据日期将月份分组并计算总数?

[英]How to group by month based on date using java and calculate total count?

如何使用Java根据日期将月份分组并计算总数?

public static void main(String[] args) {
    Map<String, Object>out=new HashMap<String, Object>();

    Map<String,Object> hm=new HashMap<String, Object>();
    List<String> al= new ArrayList<String>();
    al.add("51b6f5fde4b0dd92df2c3270");
    al.add("51b866e9e4b021170dd1ae1c");
    hm.put("sDate","02-Oct-2015");
    hm.put("status","S");
    hm.put("SMSSentId", al);
    out.put("Student1", hm);

    Map<String,Object> hm1=new HashMap<String, Object>();
    List<String> al1= new ArrayList<String>();
    al1.add("51b6f5fde4b0dd92df2c3271");
    al1.add("51b866e9e4b021170dd1ae12");
    hm1.put("sDate","03-Oct-2015");
    hm1.put("status","S");
    hm1.put("SMSSentId", al1);
    out.put("Student2", hm1);

    Map<String,Object> hm2=new HashMap<String, Object>();
    List<String> al2= new ArrayList<String>();
    al2.add("51b6f5fde4b0dd92df2c3271");
    hm2.put("sDate","03-Oct-2016");//Year changed
    hm2.put("status","S");
    hm2.put("SMSSentId", al2);
    out.put("Student3", hm2);
    //System.out.println(out);

    for (Map.Entry<String, Object> entry : out.entrySet())
    {
       // System.out.println(entry.getKey() + "/" + entry.getValue());
        for (Map.Entry<String, Object> entry1 : hm.entrySet())
        {
            System.out.println(entry1.getKey() + "/" + entry1.getValue());

            if(entry1.getKey().equals("SMSSentId"))
            {

                int a= ((List<String>) entry1.getValue()).size();

                System.out.println(a);
            }
        }
    }
}

我不知道如何修改此地图和列表。请给我建议它的正确方法或其他比较方法

我期望这个输出

# | Month |  Year  | TotalSMSSent
1    Oct     2015   4
2    Oct     2016   1

我对您的代码做了一些修改,希望对您有所帮助。我创建了一个名为Records的新类记录来保存您的所有记录。

我假设您的日期是字符串形式,因为您没有使用Java Date

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Sorted {

public static void main(String[] args) {
    Map<String, Records> out = new HashMap<String, Records>();

    List<String> al = new ArrayList<String>();
    al.add("51b6f5fde4b0dd92df2c3270");
    al.add("51b866e9e4b021170dd1ae1c");
    Records record = new Records("02-Oct-2015", "S", al);
    out.put("student1", record);

    al = new ArrayList<String>();
    al.add("51b6f5fde4b0dd92df2c3271");
    al.add("51b866e9e4b021170dd1ae12");
    record = new Records("03-Oct-2015", "S", al);
    out.put("Student2", record);

    al = new ArrayList<String>();
    al.add("51b6f5fde4b0dd92df2c3271");
    record = new Records("03-Oct-2016", "S", al);
    out.put("Student3", record);
    process(out);

}

public static void process(Map<String, Records> records) {
    HashMap<String, HashMap<String, Integer>> m = new HashMap<String, HashMap<String, Integer>>();
    HashMap<String, Integer> month = null;
    for (String recordKey : records.keySet()) {
        Records r = records.get(recordKey);
        String s[] = r.getsDate().split("-");
        if (!m.containsKey(s[2])) {
            month = new HashMap<String, Integer>();
            m.put(s[2], month);
        }
        HashMap<String, Integer> m1 = m.get(s[2]);
        if (!m1.containsKey(s[1])) {
            m1.put(s[1], records.get(recordKey).getSMSSent().size());
        } else {
            int flag = m1.get(s[1]);
            m1.put(s[1], flag + records.get(recordKey).getSMSSent().size());
        }
    }
    display(m);
}

public static void display(HashMap<String, HashMap<String, Integer>> d) {
    int i = 0;
    for (String s : d.keySet()) {
        Map<String, Integer> m = d.get(s);
        for (String s1 : m.keySet()) {
            System.out.print(i++);
            System.out.print("\t");
            System.out.print(s);
            System.out.print("\t");
            System.out.print(s1 + "\t" + m.get(s1));

            System.out.println("");
        }
    }
}

}

class Records {
private String sDate;
private String status;
private List<String> SMSSent;

public Records(String sDate, String status, List<String> sMSSent) {
    super();
    this.sDate = sDate;
    this.status = status;
    SMSSent = sMSSent;
}

public String getsDate() {
    return sDate;
}

public void setsDate(String sDate) {
    this.sDate = sDate;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public List<String> getSMSSent() {
    return SMSSent;
}

public void setSMSSent(List<String> sMSSent) {
    SMSSent = sMSSent;
}

}

输出将是:

0   2016    Oct 1
1   2015    Oct 4

根据您的要求修改代码。

请参阅下面的想法。

 final SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy"); Map<String, Object> out=new HashMap<String, Object>(); Map<String,Object> hm=new HashMap<String, Object>(); List<String> al= new ArrayList<String>(); al.add("51b6f5fde4b0dd92df2c3270"); al.add("51b866e9e4b021170dd1ae1c"); hm.put("sDate","02-Oct-2015"); hm.put("status","S"); hm.put("SMSSentId", al); out.put("Student1", hm); Map<String,Object> hm1=new HashMap<String, Object>(); List<String> al1= new ArrayList<String>(); al1.add("51b6f5fde4b0dd92df2c3271"); al1.add("51b866e9e4b021170dd1ae12"); hm1.put("sDate","03-Oct-2015"); hm1.put("status","S"); hm1.put("SMSSentId", al1); out.put("Student2", hm1); Map<String,Object> hm2=new HashMap<String, Object>(); List<String> al2= new ArrayList<String>(); al2.add("51b6f5fde4b0dd92df2c3271"); hm2.put("sDate","03-Oct-2016");//Year changed hm2.put("status","S"); hm2.put("SMSSentId", al2); out.put("Student3", hm2); List<Integer> years = Arrays.asList(2015,2016); List<Integer> months = Arrays.asList(1,2,3,4,5,6,7,8,9,10,11,12); Map<String, Integer> report = new LinkedHashMap<String, Integer>(); for (Integer year : years) { for (Integer month : months) { Integer smsCount = 0; // loop on Students for (Map.Entry<String, Object> outEntry : out.entrySet()) { Map studentData = (Map)outEntry.getValue(); String sentDateAsString = (String)studentData.get("sDate"); Date sentDate = dateFormat.parse(sentDateAsString); Calendar cal = Calendar.getInstance(); cal.setTime(sentDate); if (cal.get(Calendar.MONTH) == (month - 1) && cal.get(Calendar.YEAR) == year) { List smsList = (List)studentData.get("SMSSentId"); smsCount += smsList.size(); } } report.put(String.format("Month %d-Year %d", month, year), smsCount); } } System.out.println(report.toString()); 

输出将如下所示(注意,我尚未格式化输出,我只是打印出报告哈希图)。

{第1个月2015年= 0,第2个月2015年= 0,第3个月2015年= 0,第4个月2015年= 0,第5年2015年= 0,第6个月2015年= 0,本月2015年7月= 0、2015年8月8月= 2015年9月9月= 0、 2015年10月10月= 4 、2015年11月11月= 0、2015年12月0月= 0、1月1月年2016 = 0,月2年2016 = 0,月3年2016 = 0,月4年2016 = 0,月5年2016 = 0,月6年2016 = 0,月7年2016 = 0,第8个月(2016年)= 0,第9个月(2016年)= 0,第10个月(2016年)= 1 ,第11个月(2016年)= 0,第12个月(2016年)= 0}

您可以自定义代码,以达到自己的目的。 希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM