RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 734286
Accepted
User500S
User500S
Asked:2020-10-22 22:43:38 +0000 UTC2020-10-22 22:43:38 +0000 UTC 2020-10-22 22:43:38 +0000 UTC

Java 时间间隔的交集

  • 772

有必要确定两个时间间隔是否相互交叉。如果是这样,那么您需要将其打印到控制台。假设有两个事件,开始日期、开始时间和结束时间:

  1. 事件 1 [23.10.2017 10:00, 23.10.2017 11:00]。
  2. 事件 2 [23.10.2017 09:00, 23.10.2017 10:00]。

如您所见,它们相交。我编写了通过 if <> 语句来检查这个的代码。

问题是,是否有另一种编写逻辑的方法,例如,您可以在不同的时间间隔添加额外的 5 个事件?例如,是否可以将事件放入 Array 并编写逻辑以便验证来自 Array?或者其他方式。

结果应该是这些区间的所有交集对。

java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Suvitruf - Andrei Apanasik
    2020-10-23T00:27:48Z2020-10-23T00:27:48Z
    1. 我们运行一系列间隔。
    2. 在其中,我们在另一个循环中再次运行它。
    3. 看看它们是否重叠。
    4. 如果是,那么我们检查重复项等。
    5. 如果还没有这样的交集,则将其添加到数组中。

    额头中的近似实现,没有任何优化等:

    public static class Intercection {
        private Interval mFirst;
        private Interval mSecond;
    
        public Intercection(Interval first, Interval second) {
            mFirst = first;
            mSecond = second;
        }
    
        public Interval getFirst() {
            return mFirst;
        }
    
        public Interval getSecond() {
            return mSecond;
        }
    
        public boolean equals(Intercection another){
            return (mFirst.equals(another.mFirst) && mSecond.equals(another.mSecond)) || (mSecond.equals(another.mFirst) && mFirst.equals(another.mSecond));
        }
    
        public String toString() {
            return "[" + mFirst.toString() + " => " + mSecond.toString() + "[";
        }
    }
    
    public static class Interval {
        private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z");
    
        private ZonedDateTime mFrom;
        private ZonedDateTime mTo;
    
        public Interval(String from, String to){
            mFrom = ZonedDateTime.parse(from, DATE_FORMAT);
            mTo = ZonedDateTime.parse(to, DATE_FORMAT);
        }
    
        public static List<Intercection> getIntercection(List<Interval> intervals){
            int count = intervals.size();
            List<Intercection> intercections = new ArrayList<App.Intercection>();
    
            // находим для каждого интервала пересечения с другими интервалами
            for (int i = 0; i < count; i++) {
                Interval curInterval = intervals.get(i);
                for (int j = 0; j < count; j++) {
                    // скипаем сравнение с самим собой
                    if(curInterval == intervals.get(j))
                        continue;
    
                    Intercection inter = new Intercection(curInterval, intervals.get(j));
                    // скипаем интервалы от повторого добавления
                    if(curInterval.hashasIntercection(intervals.get(j)) && !intercections.stream().anyMatch(interscection -> interscection.equals(inter))){
                        intercections.add(inter);
                    }
                }
            }
    
            return intercections;
        }
    
        public boolean equals(Interval another){
            return mFrom.equals(another.mFrom) && mTo.equals(another.mTo);
        }
    
        /**
         * проверка на то, пересекаются ли интервалы
         * @param interval
         * @return
         */
        public boolean hashasIntercection(Interval interval){
            return mFrom.equals(interval.mFrom) || (mFrom.isBefore(interval.mFrom) && mTo.isAfter(interval.mFrom)) || (mFrom.isAfter(interval.mFrom) && mFrom.isBefore(interval.mTo));
        }
    
        public String toString() {
            return "{" + mFrom.format(DATE_FORMAT) + ":" + mTo.format(DATE_FORMAT) + "]";
        }
    }
    

    像这样使用:

        List<Interval> intervals = new ArrayList<App.Interval>();
        intervals.add(new Interval("23.10.2017 10:00 Z", "23.10.2017 11:00 Z"));
        intervals.add(new Interval("21.10.2017 10:30 Z", "25.10.2017 11:00 Z"));
        intervals.add(new Interval("23.10.2017 10:20 Z", "23.10.2017 11:00 Z"));
    
        // все пары пересечений     
        List<Intercection> intercections = Interval.getIntercection(intervals);
        intercections.forEach(inter -> System.out.println(inter.toString()));
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5