我从第三方数据库收到了以下数据集。
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。