我正在处理一项Java任务,在该任务中,我得到了一些原始数据,如下面的
Date Name Sale Discount Product
2021-02-01 LV 143 14 P1
2021-02-18 PS 473 25 P2
2021-02-01 LV 65 5 P3
2021-02-22 XB 143 14 P1
2021-02-27 PS 143 14 P1
2021-03-03 LV 263 46 P3
2021-03-16 XB 765 38 P2
我需要跟踪每月的销售额和提供的折扣,还需要跟踪每售出第三个P1产品,需要对每个月的每三个P1交易应用一些逻辑。使用Java实现上述目标的最佳方式是什么?
我正在考虑使用以年和月为键的HashMap(例如:-202103202102(,并创建一个保存所需数据的对象。请让我知道这种方法是好的,还是可以用更好的方式实施。
您正在朝着正确的方向思考
除了Map
,您还可以使用现代的Date-Time API和Stream
API。
你可以定义你的数据类,比如
class Transaction {
LocalDate date;
String name;
int sale;
int discount;
String product;
YearMonth tranYearMon;
public Transaction(LocalDate date, String name, int sale, int discount, String product) {
this.date = date;
this.name = name;
this.sale = sale;
this.discount = discount;
this.product = product;
this.tranYearMon = YearMonth.of(date.getYear(), date.getMonth());
}
// Getters, setters, toString etc.
}
现在,在处理类中,您可以像一样对数据进行分组
import java.time.LocalDate;
import java.time.YearMonth;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Transaction> list = List.of(
new Transaction(LocalDate.parse("2021-02-01"), "LV", 143, 14, "P1"),
new Transaction(LocalDate.parse("2021-02-18"), "LV", 143, 14, "P1"),
new Transaction(LocalDate.parse("2021-02-01"), "LV", 143, 14, "P1"),
new Transaction(LocalDate.parse("2021-02-22"), "LV", 143, 14, "P1"),
new Transaction(LocalDate.parse("2021-02-27"), "LV", 143, 14, "P1"),
new Transaction(LocalDate.parse("2021-03-03"), "LV", 143, 14, "P1"),
new Transaction(LocalDate.parse("2021-03-16"), "LV", 143, 14, "P1")
);
Map<YearMonth, List<Transaction>> map = list.stream().collect(Collectors.groupingBy(t ->t.getTranYearMon()));
System.out.println(map);
}
}
您可以根据您的业务逻辑执行其余的处理。
从跟踪:日期时间了解有关现代日期时间API的更多信息。
从使用Java SE 8 Streams处理数据,第1部分和第2部分:使用Java SE 8Streams处理的数据中了解有关Stream
API的更多信息。