gpt4 book ai didi

java - 使用 Java 8 构建列表数据并将其规范化为映射结构

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:33 24 4
gpt4 key购买 nike

因此,我仍然是 Java 8 的新手,并且仍在努力将流 API 与传统迭代和集合相关联。

所以我有一个对象“UserData”列表,它有 3 个属性,列表都是非规范化数据。

 public class UserData {

private String primaryAccountNumber;
private String subAccountNumber;
private String currency;
}

样本输入数据就像

PrimaryAccNumber     SubAccNumber   Currency
PA00 US00 USD
PA01 US01 USD
PA01 US02 USD
PA02 EU00 EUR
PA03 EU01 EUR
PA04 CA00 CAD
PA04 CA01 CAD
null IN00 INR
null IN01 INR

预期的输出应该是这样的

USD  -> PA00 -> [US00]
PA01 -> [US01,US02]
EUR -> PA02 -> [EU00]
-> PA03 -> [EU01]
CAD -> PA04 -> [CA00,CA01]
INR -> null (or dummykey)->[IN00,IN01]

因此,我希望以某种方式对其进行规范化,使得输出是一个以货币为键的映射,值应该是另一个以主账户为键、值以子账户列表为键的映射。

Map<String, Map<String,List<String>>> normalizedData = //logic

我基本上是想用这种老派的方式

  1. 根据货币对数据进行排序。
  2. 迭代列表并将数据放入Map中(因为数据是排序的直到我得到重复的 key 才会开始把相应的数据(新 map 中的主帐户)
  3. 基本上在主帐户级别重复上述过程,并开始将重复 key 对应值数据(列表对象中的子帐户)

至于我的思维过程,我必须创建 2 个列表副本(第一次迭代在货币中排序),在嵌套 map 的主帐户中进行第二次排序。这似乎有点低效,然后我查看了这些流,但无法想象我如何使用它们,但任何指导或想法将不胜感激。

最佳答案

使用流非常简单。最后需要几个嵌套分组和一个映射。为了简洁起见,我假设您静态导入了 java.util.stream.Collectors.*

Map<String, Map<String, List<String>>> normalizedData = users.stream().collect(
groupingBy(UserData::getCurrency,
groupingBy(UserData::getPrimaryAccountNumber,
mapping(UserData::getSubAccountNumber, toList()))));

请注意 groupingBy() doesn't allow null keys ,因此您可能确实需要使用虚拟 key 。

关于java - 使用 Java 8 构建列表数据并将其规范化为映射结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56676963/

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