如何在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,其先前的参考文献-002001(

第四行和第五行属于另一个帐户。(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, 0, T00), ()]


在一条注释中,您说这些记录没有唯一的标识符。这是个问题。

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

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

与其像现在这样解决问题,不如考虑修改您的结构,使其具有唯一的标识符。

如果有一个唯一的标识符,我们可以很容易地解决这个问题,方法是将每个记录转换为一个链表节点,用这个唯一的标识符覆盖Object.hashcode((,并将其插入一个HashMap,这是一个O(1(操作。如果上一个ref为0,我们可以到此为止。如果没有,我们还希望访问上一个ref处的HashMap节点,并将其下一个设置为当前节点。通过这种方式,我们得到了节点的面包屑轨迹。这也是另一个恒定时间O(1(运算。

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

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

类似于:

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

接收一个原始节点的列表(自从我们构建了breadcrumb以来,这些节点已经链接到了它们的下一个引用(。

这可能是在2*O(n(=O(n。

最新更新