微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在java中创建分层数据对象

如何解决如何在java中创建分层数据对象

我从第三方数据库收到以下数据集。

AccNo  AccName  CurrentRef  PrevRef  TimeStamp
001    FCA      001         0        T00
001    FCB      002         001      T01
021    FCA      003         002      T02
011    XZA      012         0        T00
011    XZC      013         012      T01
022    YAA      021         0        T00

要识别一个帐户,我们需要跟踪一个帐户的所有先前引用。如果其先前的引用为 0,则表示它是数据集中帐户的第一个条目。从以上数据集来看,

前三行属于一个帐户。 (CurrentRef - 003,它以前的引用 - 002,001)

第四和第五行属于另一个帐户。 (CurrentRef - 013,PrevRef - 012)

等等。

我需要一个可以基于 PrevIoUsRef 对这些数据进行分组的集合,以便可以在单个对象中接收以下信息,

(AccountNo-latest,Complete VO (AccNo,AccName,CurrentRef,PrevRef,TimeStamp)-latest,List of PrevIoUs References)

对于上述数据集,T02 是最新的时间戳,T00 是最早的时间戳。如果一条记录的 CurrentRef 不属于任何记录的 PrevRef,则该记录是最新的。我需要以下结果列表-

[021,(021,FCB,003,002,T02),(002,001)],[011,(011,XZC,013,012,T01),(012)],[022,(022,YAA,021,T00),()]


  

解决方法

您在评论中说这些记录没有唯一标识符。这是个问题。

我们不仅要处理重复的元素,而且还有一个更大的问题。

您运行无限递归的可能性,即 记录A的上一条记录是记录B,记录B的上一条记录是记录A。更不用说其他任意重复、前进和后退的循环了。

与其解决现在的问题,不如考虑修改您的结构,以便有一个唯一的标识符。

如果有唯一标识符,我们可以通过将每条记录转换为链表节点,使用此唯一标识符覆盖 Object.hashcode() 并将其插入到 O(1) 的 HashMap 中来轻松解决此问题手术。如果之前的 ref 为 0,我们可以到此为止。如果没有,我们还想访问前一个 ref 处的 HashMap 节点,并将其设置为当前节点的 next。这样我们就有了节点的面包屑路径。这也是另一个恒定时间 O(1) 操作。

因此,将所有记录放入 HashMap 中,我们花费 O(n) 时间构建面包屑 HashMap。

之后,我们可以再进行一次 O(n) 遍历来收集所需的列表。

类似于:

List result = hashmap.filter(node -> node.previous == null).collect(Collectors.toList())

接收原始节点的列表(自从我们建立面包屑后,这些节点就有指向它们下一个引用的链接)。

这可能是 2*O(n)=O(n) 时间内最干净和最快的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。