gpt4 book ai didi

java - 根据字符串的优先级减少对象列表

转载 作者:行者123 更新时间:2023-11-30 06:49:20 25 4
gpt4 key购买 nike

假设我有一个列表 List<Foo> mylist = parseFromCSV();

在哪里

parseFromCSV() 

返回 Foo 的对象列表类(class)。 Foo 类有她的私有(private)属性:

private mailId;
private status;

... setter和getter ...

可能是一对对象在

mylist: [{MailId=100, Status=BOUNCED, EMAIL=test@test.com},{MailId=100, Status=OPENED, EMAIL=test2@test.com}, {MailId=200, Status=CLICKED, EMAIL = test3@test.com}, {MailId=100, Status=HARDBOUNCED, EMAIL = test4@test.com}]

我的列表中确实可以有重复项,因为列出的对象代表解析为 Java 对象的 CSV 行。每个 MailId 都有多个不同的可能状态反馈。

我感兴趣的是只检索我的一个 MailId 的一组可能状态中的“重要”状态,并保存到我的数据库中。

OPENED > CLICKED > HARDBOUNCED > BOUNCED(状态的优先级)。

在我的示例中:对于 MailId= 100,我只会将 OPENED 状态保存到数据库中的状态列中。

实现这一目标的好方法是什么?我是否应该创建一个新列表(集合?),其中包含每对过滤的 {MailId, Status(Prioritized)}, ... {MailIdN, StatusN(Prioritized)...} ?我们可以使用枚举或为我的类 Foo 的对象创建一个新的比较器来增加 String 的优先级吗?

使用 hibernate 对 mysql 数据库的持久化操作应该是这样的:

persistStatusIntoTable(String MailId, String Status(Taken only status based on priority))

感谢大家的帮助!

最佳答案

如果您不想使用第 3 方库并且不想使用枚举类:

// initialization which you will have to do once somewhere in your code
List<String> ordering = Arrays.asList("OPENED", "CLICKED", "HARDBOUNCED", "BOUNCED");
Map<String, Integer> priorityMap = IntStream.range(0, ordering.size()).boxed()
.collect(Collectors.toMap(ordering::get, i -> i));

// example input
List<Foo> myList = Arrays.asList(
new Foo("100", "BOUNCED"), new Foo("100", "OPENED"),
new Foo("101", "BOUNCED"), new Foo("101", "HARDBOUNCED"), new Foo("101", "BOUNCED"));

// determine foo objects that should be persisted
Collection<Foo> toBePersisted = myList.stream()
.filter(t -> priorityMap.containsKey(t.getStatus()))
.collect(Collectors.toMap(Foo::getMailId, t -> t,
BinaryOperator.minBy(Comparator.comparing(t -> priorityMap.get(t.getStatus())))))
.values();

这段代码的作用是:

  • 设置一个将状态映射到优先级的映射(较低的 int = 较高的优先级)
  • 过滤状态无效的 Foo 实例
  • 按 mailId 对 Foo 实例进行分组
  • 保持每个组具有最小优先级整数(=最高优先级)的 Foo 实例
  • 获取结果 map 的值

关于java - 根据字符串的优先级减少对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com