如何检查 Java 中的间隔列表 (Joda-Time) 是否完全覆盖一个月

2024-05-27

我在用着乔达时间 http://www.joda.org/joda-time/Java 中用于跟踪时间列表的库间隔 http://www.joda.org/joda-time/key_interval.html。我想检查是否有一个列表Interval http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html对象完全覆盖一个月的每一分钟。大约有 30 个时间间隔,长度从几小时到几天不等。

我认为一种便宜的方法是按开始时间对间隔列表进行排序,然后连续检查月份范围内的间隔之间是否存在中断。如果是,则该月未完全覆盖。

我陷入了第一部分,对列表进行排序。我计划使用Arrays http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html.sort(),但它需要元素来实现类似的接口。然而,在查看了源代码之后,Joda-Time 的 Interval 类似乎没有一个我可以重写的类,而且我无法扩展它来编写自己的compareTo 方法。

除了编写我自己的排序方法之外,有人知道更简单的方法来完成此任务吗?谢谢


您可以使用Collections#sort http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#sort%28java.util.List,%20java.util.Comparator%29 with a Comparator http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html对时间间隔进行排序并使用Interval#gap http://www.joda.org/joda-time/apidocs/org/joda/time/Interval.html#gap%28org.joda.time.ReadableInterval%29检查是否有间隙。如果 start 和 end 之间的时间间隔完全被 timeIntervals 覆盖,以下代码将返回 true:

public static boolean isCovered(List<Interval> timeIntervals, DateTime start, DateTime end) {
    if (timeIntervals.isEmpty()) {
        return false;
    }

    // create sorted set from original List to get
    // sorted intervals without double entries
    Set<Interval> intervalSet = new TreeSet<>(new Comparator<Interval>() {
        @Override
        public int compare(Interval o1, Interval o2) {
            return o1.getStart().compareTo(o2.getStart());
        }
    });
    intervalSet.addAll(timeIntervals);

    List<Interval> intervals = new ArrayList<>(intervalSet);

    // remove intervals completely contained in others
    List<Interval> removedIntervals = new ArrayList<>();
    for (int i = 0; i < (intervals.size()-1); i++) {
        for (int j = (i+1); j < intervals.size(); j++) {
            if (intervals.get(i).contains(intervals.get(j))) {
                if (!removedIntervals.contains(intervals.get(j))) {
                    removedIntervals.add(intervals.get(j));
                }
            }
        }
    }
    intervals.removeAll(removedIntervals);

    if (intervals.get(0).getStart().isAfter(start) ||
            intervals.get(intervals.size() - 1).getEnd().isBefore(end)) {
        return false;
    }

    // check for gaps
    for (int i = 0; i < (intervals.size() - 1); i++) {
    Interval gap = intervals.get(i).gap(intervals.get(i+1));
        if (gap != null && new Interval(start, end).overlaps(gap)) {
            // gap detected between interval i and interval (i+1)
            return false;
        }
    }

    return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 Java 中的间隔列表 (Joda-Time) 是否完全覆盖一个月 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐