如何解决如何在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 举报,一经查实,本站将立刻删除。