购物小票统计
输入至少30份购物小票,信息如下:
年、月、日、时间 购物金额
例如:
2019-5-17 10:37:37 28.5
2019-3-21 20:20:20 100.8
对上述小票金额按从星期一到星期天进行统计,得出结果如下:
星期一 100元
星期二 150元
到
星期日 180元
整体思路是遍历,转换,求和,可以参考下
public static void main(String[] args) {
ArrayList<Ticket> tickets = new ArrayList<Ticket>() {
private static final long serialVersionUID = -6219672635156858121L;
{
add(Ticket.builder().date("2019-5-17 10:37:37").money("28.5").build());
add(Ticket.builder().date("2019-3-21 20:20:20").money("150").build());
}
};
HashMap<Week, String> weekStringHashMap = new HashMap<>();
tickets.stream().forEach(ticket -> {
getData(weekStringHashMap,ticket);
});
weekStringHashMap.forEach((k,v)->{
System.out.println(String.format("%s ===== %s ",k,v));
});
}
private static void getData(HashMap<Week, String> hashMap, Ticket ticket) {
String ticketDate = ticket.getDate();
DateTime parse = DateUtil.parse(ticketDate, "yyyy-MM-dd HH:mm:ss");
Week week = DateUtil.dayOfWeekEnum(new Date(parse.getTime()));
String result = hashMap.putIfAbsent(week, ticket.getMoney());
if (StrUtil.isNotBlank(result)) {
BigDecimal sum = new BigDecimal(result).add(new BigDecimal(ticket.getMoney()));
hashMap.put(week, sum.toString());
}
}
循环求和完事
1.先根据日期group by 后计算金额
2.在利用Date的辅助类将日期转成对应的周天
3、输出展示
1.根据题目的要求没有看到说是日期必须是连续的 所以可以根据不同的日期来计算出当天是星期几
2.根据计算出来的星期几来进行group by 然后进行sum 即可 来计算出 不同星期的不同金额
3.SELECT DAYOFWEEK('2022-05-19'); 该为查询当前日期星期几的函数 返回结果集如下
2 ——> 星期一
3 ——> 星期二
4 ——> 星期三
5 ——> 星期四
6 ——> 星期五
7 ——> 星期六
1 ——> 星期日
日期直接转成星期 然后分组求和
这种就比较简单啦
1,定义一个list 存储购物小票
2,对购物小票进行分组 map: key 存储星期, value:存储累加的和
3,对星期进行排序
4,输出
package com.demo;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* 统计购物小票
*/
public class StatisticsTest {
/**
* 购物小票列表
*/
private static List<ShoppingTicket> tickets = new ArrayList<>();
//星期
private static String[] week = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
public static void main(String[] args) {
//输入购物小票N 份
tickets.add(new ShoppingTicket("2022-05-19 17:22:23", BigDecimal.valueOf(50.26)));
tickets.add(new ShoppingTicket("2022-05-18 17:22:23", BigDecimal.valueOf(10.36)));
tickets.add(new ShoppingTicket("2022-05-19 14:22:23", BigDecimal.valueOf(3.26)));
Map<Integer, StatisticsTicket> statisticsMap = new HashMap<>();
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//按星期进行分组金额累加
tickets.forEach(v -> {
//得到日期是星期几
int weekDay = LocalDateTime.parse(v.getTime(), df).getDayOfWeek().getValue();
StatisticsTicket statisticsTicket = statisticsMap.get(weekDay);
if (statisticsTicket == null) {
statisticsTicket = new StatisticsTicket();
statisticsTicket.setSumMoney(BigDecimal.ZERO);
}
//设置日期对应的中文日期, 就是上面定义的数组
statisticsTicket.setWeek(week[weekDay-1]);
statisticsTicket.setWeekIndex(weekDay);
//设置金额,累加相同星期的金额
statisticsTicket.setSumMoney(statisticsTicket.getSumMoney().add(v.getMoney()));
statisticsMap.put(weekDay, statisticsTicket);
});
//对统计结果进行排序
List<StatisticsTicket> resultList = statisticsMap.values().stream().sorted(Comparator.comparing(StatisticsTicket::getWeekIndex)).collect(Collectors.toList());
//输出结果
for (StatisticsTicket result : resultList) {
System.out.println("得出结果:星期: " + result.getWeek() + ";购买金额: " + result.getSumMoney());
}
}
/**
* 统计后的小票
*/
private static class StatisticsTicket {
private Integer weekIndex;
private String week;
private BigDecimal sumMoney;
public Integer getWeekIndex() {
return weekIndex;
}
public void setWeekIndex(Integer weekIndex) {
this.weekIndex = weekIndex;
}
public String getWeek() {
return week;
}
public void setWeek(String week) {
this.week = week;
}
public BigDecimal getSumMoney() {
return sumMoney;
}
public void setSumMoney(BigDecimal sumMoney) {
this.sumMoney = sumMoney;
}
}
/**
* 购物小票
*/
private static class ShoppingTicket {
/**
* 购物时间
*/
private String time;
/**
* 购物金额
*/
private BigDecimal money;
public ShoppingTicket(String time, BigDecimal money) {
this.time = time;
this.money = money;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public BigDecimal getMoney() {
return money;
}
public void setMoney(BigDecimal money) {
this.money = money;
}
}
}
不需要按年月分组的话,简单方法可以定义周一到周日七个变量,然后遍历数据,日期字符串转日期取周几,条件语句判断然后累加求和,遍历完最后输出结果。
利用文件输入比较方便 30条日期 和消费金额 这里用了8条记录 文件名为costInfo.txt 路径就是项目根目录
2019-5-17 10:37:37
28.5
2019-3-21 20:20:20
100.8
2019-5-17 10:37:37
28.5
2019-5-18 20:20:20
109.8
2019-5-17 10:37:37
28.5
2019-3-22 20:20:20
20.8
2019-5-17 10:37:37
28.5
2019-3-22 20:20:20
20.8
接下来是代码
首先是实体对象 购物信息类
package 购物小票;
/**
* 商品类
* @author whd
*
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Items {
private Date date;//购物时间 年月日时间
private double cost;//花费金额
public Date getDate() {
return date;
}
public double getCost() {
return cost;
}
public Items(String date,double cost) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
this.date= sdf.parse(date);
this.cost = cost;
}
@Override
public String toString() {
return "Items [date=" + date + ", cost=" + cost + "]";
}
}
然后是测试类Test
package 购物小票;
import java.io.File;
import java.io.FileNotFoundException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws ParseException, FileNotFoundException {
ArrayList<Items> list = new ArrayList<>();// 存储小票信息
File file = new File("costInfo.txt");
Scanner input = new Scanner(file);
System.out.println("请输入30条购物信息:");
while (input.hasNext()) {
String date = input.nextLine();
double cost = Double.parseDouble(input.nextLine());
System.out.println(date + "," + cost);
list.add(new Items(date, cost));
}
double[] cost = new double[7];// 星期一到星期天每天的总花费 存一个数组
for (int i = 0; i < list.size(); i++) {
int day = list.get(i).getDate().getDay();// 获取星期几
switch (day) {
case 0:
cost[6] += list.get(i).getCost();
break;
case 1:
cost[0] += list.get(i).getCost();
break;
case 2:
cost[1] += list.get(i).getCost();
break;
case 3:
cost[2] += list.get(i).getCost();
break;
case 4:
cost[3] += list.get(i).getCost();
break;
case 5:
cost[4] += list.get(i).getCost();
break;
case 6:
cost[5] += list.get(i).getCost();
break;
default:
throw new IllegalArgumentException("Unexpected value: " + day);
}
}
System.out.println("星期一 "+cost[0]+"元");
System.out.println("星期二 "+cost[1]+"元");
System.out.println("星期三 "+cost[2]+"元");
System.out.println("星期四 "+cost[3]+"元");
System.out.println("星期五 "+cost[4]+"元");
System.out.println("星期六 "+cost[5]+"元");
System.out.println("星期日 "+cost[6]+"元");
}
}
最后是运行结果
你好,如果觉得有用请点个采纳 谢谢 有什么不懂的私信问我
用户qfl_sdu的回答是正解,其实方法还可以简化一些,就是将输入的每一条数据存放到list中,然后循环处理list,将日期相同的数据分成一个组,组中包含日期和金额,将一组中的数据处理后变成一个map,map中的key为日期,value为金额,多个组对应多个map,然后将map放到一个新的list2中,循环处理list2,输出日期和金额