Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中创建分层数据对象_Java_Algorithm_Data Structures - Fatal编程技术网

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

如何在java中创建分层数据对象,java,algorithm,data-structures,Java,Algorithm,Data Structures,我已从第三方数据库收到以下数据集 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

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

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,则表示它是数据集中帐户的第一个条目。根据上述数据集

前三行属于一个帐户。(当前参考-003,其先前参考-002001)

第四行和第五行属于另一个帐户。(当前参考-013,当前参考-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。更不用说其他任意重复、向前和向后的循环了

<> P>而不是像现在那样解决这个问题,考虑修改你的结构,所以有一个唯一的标识符。 如果存在唯一标识符,我们可以通过将每个记录转换为链表节点、使用该唯一标识符重写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())
接收原始节点列表(自构建面包屑以来,这些节点具有指向其下一个引用的链接)


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

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

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

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

<> P>而不是像现在那样解决这个问题,考虑修改你的结构,所以有一个唯一的标识符。 如果存在唯一标识符,我们可以通过将每个记录转换为链表节点、使用该唯一标识符重写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())
接收原始节点列表(自构建面包屑以来,这些节点具有指向其下一个引用的链接)


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

CurrentRef是否唯一?这里有唯一标识符吗?没有,没有唯一标识符。CurrentRef唯一吗?这里有唯一标识符吗?没有,没有唯一标识符。谢谢你的回答。但是,我需要根据从第三方接收到的数据集准备数据。如果是这种情况,请假设一个唯一的密钥,如PrevRef。采取相同的操作过程,但是在处理每个对象时,检查它是否已经存在于HashMap中。如果有,那么应该提醒第三方,因为主题上不应该有重复的条目。如果你的第三方没有提供不好的数据,这很酷,但不要指望总是这样。谢谢你的回答。但是,我需要根据从第三方接收到的数据集准备数据。如果是这种情况,请假设一个唯一的密钥,如PrevRef。采取相同的操作过程,但是在处理每个对象时,检查它是否已经存在于HashMap中。如果有,那么应该提醒第三方,因为主题上不应该有重复的条目。如果你的第三方没有提供不好的数据,这很酷,但不要指望总是这样。