java – 从事件对象打印所有时间间隔的好方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 从事件对象打印所有时间间隔的好方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4038字,纯文字阅读大概需要6分钟。
内容图文
![java – 从事件对象打印所有时间间隔的好方法](/upload/InfoBanner/zyjiaocheng/789/5ff73932400642b790bafe39034cd6a1.jpg)
我正在使用包含开始和结束时间的事件对象.我想打印一些事件对象的arraylist的所有间隔,但只能想到一个trival暴力解决方案.
假设我们的arraylist有以下事件:
事件1:开始= 130,结束= 145
事件2:开始= 135,结束= 155
事件3:开始= 145,结束= 155
事件4:开始= 215,结束= 230
事件5:开始= 215,结束= 230
然后我们想要打印像:
130 – 135
135 – 145
145 – 155
215 – 230
到目前为止,我所能想到的是根据开始时间对arraylist进行排序.对于每个开始时间,遍历整个列表并选择最小的开始时间和结束时间,该时间大于该开始时间.当添加更多事件时,此解决方案似乎是强力和低效的.请注意,如果需要,我总是可以选择另一种数据结构 – 我在间隔树上读了一下但是我不确定在这种情况下它是否有用.
我正在寻找关于存储事件的最佳数据结构的建议以及打印所有有效间隔的好算法(希望比我想到的更好).任何建议,将不胜感激!
谢谢.
解决方法:
我建议使用链接列表.链表中的每个节点仅包括节点内的间隔开始和结束时间,附加集具有包含其所有数据的原始事件对象.
核心概念是任何添加的事件在链表中按顺序放置,如果它以任何方式与现有间隔相交,则相应地将其拆分.如果您还想支持删除事件,那么您删除的任何事件都将删除一个间隔或导致其中一些间隔收敛.
间隔的打印输出内置于解决方案中:链接列表是按发生顺序排列的间隔(没有重叠,如您所述),每个间隔的事件附加事件.无论关联事件的数量如何,您都可以迭代间隔并打印出节点.
一点符号:
> se – 事件的开始时间
> ee – 活动结束时间
> si – 列表中间隔节点的开始时间
> ei – 列表中间隔节点的结束时间
为了描述构建此数据结构,我们首先描述如何向其中添加新事件.该算法有许多不同交叉点的情况,这使得它有点长读 – 但易于编码:
>结束案例:如果列表为空,则以root身份创建一个新的列表节点,其中包含事件的开始和结束时间并创建其集合,将新事件添加为集合中的第一个成员.
>结束案例:如果您位于列表的末尾,请为新事件创建新的间隔列表节点,并将其连接到上一个节点.
>如果当前列表节点完全大于事件时间(事件结束时间之后发生间隔) – 为新事件创建一个新的间隔列表节点并将其放在当前节点之前,使用前一个间隔节点正确链接它.
>如果当前列表节点完全小于事件时间(在事件开始时间之前发生间隔) – 请提前一个节点.
>如果当前列表节点完全包含在新事件中(间隔节点开始时间si在事件开始时间ei之后且间隔节点结束时间se在事件结束时间ee之前) – 创建两个新的间隔节点,一个在当前间隔之前和之后一个并且将它们相关联 – {se-si} {si-ei} {ei-ee} – 将事件添加到所有三个相关集合.两个新节点将只在其集合中具有新事件,原始节点将具有添加到集合中的新事件的所有事件.
>如果当前列表节点完全包含事件(si在se之前,ee在ei之前) – 为之前和之后创建两个新节点,正确链接它们,将间隔的事件集添加到新节点,更改中间节点值为{se-ee},因此你有一个链:{si-se} {se-ee} {ee-ei}.仅将新事件添加到中间节点所拥有的集合中.
>如果当前列表间隔节点以事件开始,但在它之前结束(se = si,但是ei< ee),则在其集合中仅创建新事件{ei-ee},并在之后添加它当前节点(正确链接),并将事件添加到当前列表节点.
>如果当前列表间隔节点以事件结束,但在事件开始后开始(se> si,但是ei = ee),则在其集合中仅创建一个新事件{se-si}并添加它在当前节点之前(正确链接),并将事件添加到当前列表节点.
>如果当前列表间隔节点以事件开始但在间隔之前结束(se = si,但是ei> ee),则创建一个新节点{ee-ei},其中所有现有列表节点事件都复制到其集合中新事件,并将其链接到当前节点之后.同时将当前节点从{si-ei}更改为{si-ee}.
>如果当前列表节点在事件之前启动但它们一起结束(se< si,但是ei = ee),则创建一个新节点{se-si},其中所有现有列表节点事件都复制到其集合中以及新事件,并在当前节点之前链接它.同时将当前节点从{si-ei}更改为{se-ei}.
>如果当前列表间隔节点在事件开始之后开始并且也在事件结束之后结束(se< si和ee< ei),则在当前的节点周围创建两个新节点,并像以前那样改变当前间隔 - {SE-SI} {SI-EE} {EE-EI}.此三重奏中的第一个间隔将仅在其集合中具有新事件,中间一个将具有所有原始节点的集合以及新事件,并且最后一个将仅具有原始节点的集合.
>如果当前列表间隔节点在事件开始之前开始并且也在事件结束之前结束(se> si和ee> ei),则在当前列表周围创建两个新节点,并像以前一样更改当前间隔 – {SI-SE} {SE-EI} {EI-EE}.此三重奏中的最后一个间隔将仅在其集合中具有新事件,中间一个将具有所有原始节点的集合以及新事件,并且第一个间隔将仅具有原始节点的集合.
>最后,如果事件与时间间隔完全匹配,只需将其添加到集合中即可.
结果是你有一个不重叠且按时间顺序排列的间隔列表,你可以迭代它们进行打印而没有问题,你可以说每个间隔在那个间隔发生哪些事件.您可以轻松修改算法的实现以包括删除事件,或者如果您需要搜索它,您可以将其从链表更改为数组列表以使用二进制搜索.
内容总结
以上是互联网集市为您收集整理的java – 从事件对象打印所有时间间隔的好方法全部内容,希望文章能够帮你解决java – 从事件对象打印所有时间间隔的好方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。