在Java列表中获取下一次

在Java列表中获取下一次,java,list,Java,List,我的逻辑在这一点上让我难以理解,我希望有人有一些我可以学习的代码 在java中,我有一个自定义对象列表,该对象的一个成员是某个事件的日期/时间 我需要能够从当前/本地时间在列表中找到下一次 当地时间是下午6点 清单包括: 下午1点、3点、4点、7点、10点 我需要一个方法,基本上拉出晚上7点,作为下一个事件的时间处理 任何建议、指示都值得欣赏,thx您可以通过假设列表中的第一个dateTime对象最初是最接近的,然后迭代以确定列表中的任何其他dateTime是否更接近您的参考dateTime来实

我的逻辑在这一点上让我难以理解,我希望有人有一些我可以学习的代码

在java中,我有一个自定义对象列表,该对象的一个成员是某个事件的日期/时间

我需要能够从当前/本地时间在列表中找到下一次

当地时间是下午6点 清单包括:

下午1点、3点、4点、7点、10点

我需要一个方法,基本上拉出晚上7点,作为下一个事件的时间处理


任何建议、指示都值得欣赏,thx

您可以通过假设列表中的第一个dateTime对象最初是最接近的,然后迭代以确定列表中的任何其他dateTime是否更接近您的参考dateTime来实现。如下所示:

    import java.util.ArrayList;
    import java.util.List;

    import org.joda.time.DateTime;

    public class test {
        public static void main(String[] args) {
            CustomData cd1 = new CustomData("data1", new DateTime(100000));
            CustomData cd2 = new CustomData("data2", new DateTime(200000));
            CustomData cd3 = new CustomData("data3", new DateTime(300000));
            CustomData cd4 = new CustomData("data4", new DateTime(400000));
            List<CustomData> dataList = new ArrayList<CustomData>();

            dataList.add(cd1);
            dataList.add(cd2);
            dataList.add(cd3);
            dataList.add(cd4);

            DateTime closestDate=dataList.get(0).getDateTime();  //initially assume first dateTime to be the closest
            for(CustomData cd:dataList){
                if(cd!=null && cd.getDateTime()!=null && cd.getDateTime().isBefore(closestDate.getMillis()) && cd.getDateTime().isAfter(DateTime.now())){
                    /*if the date time is before the closest date and after the reference DateTime you are comparing(in this case DateTime.now()) update the reference of closestDate */                
                closestDate=cd.getDateTime();
                }
            }

            System.out.println(closestDate);
        }

    }
假设:

您有一个具有时间属性的类事件, time属性的类型为java.time.LocalTime或其他类似于java.util.Date的自然顺序,或者您可以轻松提供比较器, 您在java.util.List中有未排序的事件, 您的类事件根据时间定义了一个自然顺序,或者您提供了一个比较器,该比较器根据事件对象的时间属性对其进行比较, 基本上,课堂活动的相关要点是

import java.time.LocalTime;

public class Event implements Comparable<Event> {
    LocalTime time;
    @Override
    public int compareTo(final Event o) {
        return time.compareTo(o.time);
    }
}
它应该同样适用于其他时间类,如java.util.Date,而不是java.time.LocalTime,只要它们是可比较的,或者您可以提供一个比较器

如果您弄乱了这段代码,您可能需要对其进行测试。以下是我用于此测试的相关代码:

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

public class Event implements Comparable<Event> {
    String title;
    LocalTime time;

    public Event(final String title, final LocalTime time) {
        this.title = title;
        this.time = time;
    }

    public Event(final String descriptor) {
        this(descriptor.substring(6), LocalTime.parse(descriptor.substring(0, 5)));
    }

    public String getTitle() { return title; }
    public LocalTime getTime() { return time; }

    @Override
    public int compareTo(final Event o) { return time.compareTo(o.time); }

    public static List<Event> createEventList(final String... descriptors) {
        final List<Event> events = new ArrayList<>();
        for (final String descriptor : descriptors)
            events.add(new Event(descriptor));
        return events;
    }
}
以及单元测试:

import org.junit.Test;
import java.util.List;
import static java.time.LocalTime.of;
import static java.util.Collections.emptyList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static stackexchange.stackoverflow.q27350515.Event.createEventList;
import static stackexchange.stackoverflow.q27350515.FindNextDate.getNextEvent;

public class FindNextDateTest {
    @Test public void givenEmptyList_whenFindingNext_thenReturnsNull() {
        assertNull(getNextEvent(emptyList(), of(6, 0)));
    }

    @Test public void givenOneElementListWithSmallerElement_whenFindingNext_thenReturnsNull() {
        final List<Event> events = createEventList("10:15 Breakfast");
        assertNull(getNextEvent(events, of(11, 0)));
    }

    @Test public void givenOneElementListWithLargerElement_whenFindingNext_thenReturnsElement() {
        final List<Event> events = createEventList("12:15 Lunch");
        assertEquals(events.get(0), getNextEvent(events, of(11, 0)));
    }

    @Test public void givenBigList_whenFindingNext_thenReturnsElement() {
        final List<Event> events = createEventList("10:15 Breakfast", "12:15 Lunch", "08:00 Morning walk", "11:15 Power nap", "14:00 Power nap", "20:00 Dinner");
        assertEquals(events.get(3), getNextEvent(events, of(11, 0)));
    }
}

有一个“最近的时间”,并在浏览列表时分配它。您可以根据项目与当前时间的接近程度对列表进行排序…如果您使用合适的比较器,您可以调用,它将执行您想要的操作。也许您应该看看以下内容:
public static Event getNextEventUsingComparison(final List<Event> unsortedEvents, final LocalTime timestamp) {
    Event candidateEvent = null;
    for (final Event event : unsortedEvents)
        if (event.getTime().isAfter(timestamp) && (candidateEvent == null || event.getTime().isBefore(candidateEvent.getTime())))
            candidateEvent = event;
    return candidateEvent;
}

public static Event getNextEventUsingStreams(final List<Event> unsortedEvents, final LocalTime timestamp) {
    return unsortedEvents.stream().filter(t -> t.getTime().isAfter(timestamp)).sorted().findFirst().orElse(null);
}

public static Event getNextEventUsingTreeMap(final List<Event> unsortedEvents, final LocalTime timestamp) {
    final TreeMap<LocalTime, Event> timeEventMap = new TreeMap<>();
    for (final Event event : unsortedEvents)
        timeEventMap.put(event.getTime(), event);
    final LocalTime key = timeEventMap.ceilingKey(timestamp);
    return key != null ? timeEventMap.get(key) : null;
}
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

public class Event implements Comparable<Event> {
    String title;
    LocalTime time;

    public Event(final String title, final LocalTime time) {
        this.title = title;
        this.time = time;
    }

    public Event(final String descriptor) {
        this(descriptor.substring(6), LocalTime.parse(descriptor.substring(0, 5)));
    }

    public String getTitle() { return title; }
    public LocalTime getTime() { return time; }

    @Override
    public int compareTo(final Event o) { return time.compareTo(o.time); }

    public static List<Event> createEventList(final String... descriptors) {
        final List<Event> events = new ArrayList<>();
        for (final String descriptor : descriptors)
            events.add(new Event(descriptor));
        return events;
    }
}
import org.junit.Test;
import java.util.List;
import static java.time.LocalTime.of;
import static java.util.Collections.emptyList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static stackexchange.stackoverflow.q27350515.Event.createEventList;
import static stackexchange.stackoverflow.q27350515.FindNextDate.getNextEvent;

public class FindNextDateTest {
    @Test public void givenEmptyList_whenFindingNext_thenReturnsNull() {
        assertNull(getNextEvent(emptyList(), of(6, 0)));
    }

    @Test public void givenOneElementListWithSmallerElement_whenFindingNext_thenReturnsNull() {
        final List<Event> events = createEventList("10:15 Breakfast");
        assertNull(getNextEvent(events, of(11, 0)));
    }

    @Test public void givenOneElementListWithLargerElement_whenFindingNext_thenReturnsElement() {
        final List<Event> events = createEventList("12:15 Lunch");
        assertEquals(events.get(0), getNextEvent(events, of(11, 0)));
    }

    @Test public void givenBigList_whenFindingNext_thenReturnsElement() {
        final List<Event> events = createEventList("10:15 Breakfast", "12:15 Lunch", "08:00 Morning walk", "11:15 Power nap", "14:00 Power nap", "20:00 Dinner");
        assertEquals(events.get(3), getNextEvent(events, of(11, 0)));
    }
}