确定哪两个事件更近?

时间:2018-03-19 19:23:04

标签: java time

我想知道哪个事件更近了。

现在,我编写的代码依赖于比较,并且似乎每次都不起作用。

与我尝试做的所有事情一样,我想要一个既干净又高效的解决方案(随意批评我的代码)。

事件有一个特定的小时(例如16:00),暗示如何添加这个级别的细节会很好。

以下是代码:

public static int getNextEvent() 
{

    int event1 = 2; //Those events happen every week and have specific
                    //hours (didn't implement those because I have no
                    //idea how to, suggestions are greatly appreciated here)
    int event2 = 6;
    int result = 0;
    int currentDay = 6; //Days go from monday (1) to sunday (7), here this is hardcoded, in the actual program it is not.
    List<Integer> eventList = new ArrayList<Integer>();

    if (currentDay <= event1) //This is the comparison I was talking about
    { 
        eventList.add((event2-currentDay)); // These two are in this specific order because I use the indexOf for later methods (yes, those events are hardcoded, that's fine)
        eventList.add((event1-currentDay)); //
    }
    else
    {
        currentDay = currentDay - 7;
        eventList.add((event2-currentDay)); // These two are in this
                                            // specific order because
                                            // I use the indexOf for
                                            // later methods (yes,
                                            // those events are
                                            // hardcoded, that's fine)
        eventList.add((event1-currentDay)); //
    }

    result = determineClosestEvent(eventList) + 1; // I add 1 because my other methods 
                                                   //do not start at 0 but at 1 
                                                   //(see ^ that comment)

    return result;
}

private static int determineClosestEvent(List<Integer> eventList) 
{

    int closestDay = 10;
    int listGet;

    for (int i = 0; i < eventList.size(); i++) 
    {
        listGet = eventList.get(i);
        if (closestDay > listGet) 
        {
            closestDay = listGet;
        } else {}
    }

    closestDay = eventList.indexOf(closestDay);

    return closestDay;
}

2 个答案:

答案 0 :(得分:1)

为您的活动设计Event课程。使用DayOfWeek(来自java.time,现代Java日期和时间API)用于事件的一周,而LocalTime用于一天中的时间。

要了解每个事件的过去或未来的距离,请先使用ZonedDateTime.now(yourTimeZone)确定当前的日期和时间。鉴于currentDateTimeZonedDateTime,请使用currentDateTime.toLocalDate().getDayOfWeek()获取今天的某一天。

对于每个事件,如果今天没有发生,请考虑前一个事件和下一个事件(如果这是合适的,请根据您的要求)。使用TemporalAdjusters.previous()TemporalAdjusters.next()查找日期。然后LocalDate.atTimeLocalDateTime.atZone获取ZonedDateTime,了解事件发生或发生的时间。既然当前时间为ZonedDateTime而事件时间为{1},请使用Duration.between()查看此事件过去或未来的距离。您可能希望Duration.abs()确保持续时间为非负数。并且Duration.compareTo用于确定哪个持续时间更短。你有最近的活动。

快乐的编码。

<强>链接

答案 1 :(得分:0)

不关心公共/私人问题:

import java.util.*;

/ * 您可以通过将代码复制到一个名为EventTest的大文件中来测试代码。您可以缩进评论或删除它们。为了更好的可读性,我在这里取消了它们。看看Interface Comparable,一个非常有用的接口,因为如果你定义了这样一个方法,你可以用Java方法对这些东西的Collection进行排序。 * /

class MyDate implements Comparable <MyDate> {

/ *   只是一周中的一个简单的int,就像你的尝试一样。 * /         int dow;

    public MyDate (int dow)
    {
        this.dow = dow;
    }

    // if other date is over, next date is in next week - add 7.
    public int compareTo (MyDate other) {
        int diff = other.dow - dow;
        if (diff < 0) diff += 7;
        return diff;
    }

    public String toString () {
        return "" + dow;
    }
}

/ *   一个事件有一个日期 - 我们也有一个名字: * /

class Event {
    String name;
    public MyDate dow;

    public Event (String name, MyDate dow)
    {
        this.dow = dow;
        this.name = name;
    }

/ * 为了以后的使用,我们提供了一个dateDiff方法,该方法将日期的比较委托给dow.compareTo方法: * /

    public int dateDiff (MyDate cmp) {
        return dow.compareTo (cmp);
    }

    public String toString () {
        return name + " " + dow;
    }
}

/ *   我们需要一个额外的比较器,将不同的事件与外部给定的MyDate进行比较。 * /

class EventComparator implements Comparator <Event>
{
    MyDate crucialDate;
    public EventComparator (MyDate crucial)
    {
        crucialDate = crucial;
    }
    public int compare (Event e1, Event e2)
    {
        int diff = (e1.dateDiff (crucialDate)) - (e2.dateDiff (crucialDate));
        return diff;
    }
}

/ * 现在是一个胖测试课。 * /

public class EventTest {

/ * 在测试testMany()方法之前,首先尝试理解test2方法的工作原理。 * /

    public static void main(String[] args) {
        test2 ();
        // testMany ();
    }

/ * 比较器在这里有重要时刻。好吧 - 它为给定的MyDate'当前'事件列表排序。如果列表不为空,则第一个元素是(最近的)最接近的元素。 * /

    static List<Event> findClosest (MyDate current, List<Event> events) {
        EventComparator ec = new EventComparator (current);
        events.sort (ec);
        return events;
    }

/ * 如您的示例所示,2个日期(2,6)和currentDay(6)。 使用事件列表并包含相同的元素,可能以不同的顺序: * /
        static void test2(){             列出eventList = new ArrayList&lt;&gt; ();             eventList.add(new Event(“Dow:2”,new MyDate(2)));             eventList.add(new Event(“Dow:6”,new MyDate(6)));             MyDate currentDay = new MyDate(6);             System.out.println(“unsorted”);             show(eventList);             System.out.println(“已排序”);             findClosest(currentDay,eventList);             show(eventList);         }

    static void testMany () {
        Random r = new Random ();
        // eventList.add (new Event ("Dow: " + day, new MyDate (day)));
        List<Event> eventList = new ArrayList<> ();
        for (int i = 0; i < 10; ++i) {
            int day = r.nextInt (7) + 1;
            eventList.add (new Event ("Dow: " + day, new MyDate (day)));
        }
        for (int today = 1; today <= 7; ++today) {
            MyDate currentDay = new MyDate (today);
            System.out.println ("unsorted " + currentDay);
            show (eventList);
            findClosest (currentDay, eventList);
            System.out.println ("sorted "+ currentDay);
            show (eventList);
        }
    }

    public static void show (List <Event> events) {
        for (Event e : events)
            System.out.println (e);
    }
}

您稍后可以将MyDate类扩展为包含小时数。从语义上讲,我没有检查算法是否按预期工作。你应该先编写一些测试用例

  • 比今天低2个日期
  • 先降低,高出第二
  • 第一个更高,第二个更低
  • 均高于今天
  • 不同距离,相同距离,
  • 与currentDay相同的日期

创建一个小表并首先写下预期结果,然后查看它是否有效。