我想知道哪个事件更近了。
现在,我编写的代码依赖于比较,并且似乎每次都不起作用。
与我尝试做的所有事情一样,我想要一个既干净又高效的解决方案(随意批评我的代码)。
事件有一个特定的小时(例如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;
}
答案 0 :(得分:1)
为您的活动设计Event
课程。使用DayOfWeek
(来自java.time,现代Java日期和时间API)用于事件的一周,而LocalTime
用于一天中的时间。
要了解每个事件的过去或未来的距离,请先使用ZonedDateTime.now(yourTimeZone)
确定当前的日期和时间。鉴于currentDateTime
是ZonedDateTime
,请使用currentDateTime.toLocalDate().getDayOfWeek()
获取今天的某一天。
对于每个事件,如果今天没有发生,请考虑前一个事件和下一个事件(如果这是合适的,请根据您的要求)。使用TemporalAdjusters.previous()
和TemporalAdjusters.next()
查找日期。然后LocalDate.atTime
和LocalDateTime.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类扩展为包含小时数。从语义上讲,我没有检查算法是否按预期工作。你应该先编写一些测试用例
创建一个小表并首先写下预期结果,然后查看它是否有效。