【问题标题】:Monthly tracker in javajava中的每月跟踪器
【发布时间】:2021-07-03 07:58:32
【问题描述】:

我正在处理一项 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(例如:-202103、202102)并创建一个包含所需数据的对象。请让我知道该方法是否可行或可以以更好的方式实施。

【问题讨论】:

  • 您将此标记为“性能”,但这通常应该是您在此类作业中最不关心的问题。首先让它干净且可用,并且当且仅当您发现它太慢(这对于这些类型的数据集来说不太可能),您才能努力优化它。是的,我知道您可能想“了解性能”,但干净且可读的代码更为重要。您没有告诉的是您如何获取该数据。你说你需要“跟踪”它。这是什么意思?
  • 嗨@JoachimSauer,感谢您的意见,我想找到最好的解决方案,这就是我使用性能标签的原因。通过跟踪,我指的是每月审计数据,例如特定月份提供的销售额和折扣。我希望它能回答你的问题,如果我需要任何进一步的信息,请告诉我。
  • 不要专注于“最好的可能”,这是一个不可能实现的目标,而且定义也非常模糊。什么是最好的?使用最少的内存?最少的 CPU 时间?最有反应?最漂亮的用户界面?最流行的实现?最简陋的微服务架构?还是完全可测试的?对于所有可能的方式来判断“最佳”,几乎没有“可能的最佳”,总会有妥协。
  • 罗杰,@JoachimSauer,我知道总会有一些妥协,这里的最佳解决方案是指除了我正在推进的解决方案(这里是 HashMap)之外,是否还有更好的解决方案。跨度>

标签: java performance date


【解决方案1】:

你的想法是对的。

除了Map,您还可以使用modern Date-Time APIStream 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);
    }
}

你可以根据你的业务逻辑来做剩下的处理。

Trail: Date Time 了解有关现代日期时间 API 的更多信息。

Processing Data with Java SE 8 Streams, Part 1Part 2: Processing Data with Java SE 8 Streams 了解有关Stream API 的更多信息。

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多