У меня нет большого опыта работы с Onboard SDK, но в теории я считаю, что ответ - да, ваш подход должен работать.
Я сделал нечто подобное в противоположном случае, используя мобильный SDK и sendDataToOnboardSDKDevice (см. Мой в настоящее время оставшийся без ответа вопрос ) и через другие мобильные обратные вызовы (startMission, SdCardCallbacks и т.д.), где изменить глобальную переменную, и он обновляет что-то в другом месте.
Итак, в принципе, ответ да, но я не знаю достаточно о встроенном sdk (c ++?), Чтобы знать, что ваш конкретный код реализован правильно.
Решение Sietse de Kaper предполагает, что реверс отсортировал список, определенно не самая естественная вещь иметь вокруг
Естественный порядок сортировки в Java следует за возрастающим естественным упорядочиванием. (см. http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html#sort Collection.sort (java.util. Список) документация)
От Вашего примера,
target date = 2008-10-03 list = 2008-10-01 2008-10-02 2008-10-04
Если бы другой разработчик использует Ваш метод с наивным подходом, он добрался бы 01.10.2008, который не является тем, что ожидалось
private Date getDateNearest(List<Date> dates, Date targetDate){
Date returnDate = targetDate
for (Date date : dates) {
// if the current iteration'sdate is "before" the target date
if (date.compareTo(targetDate) <= 0) {
// if the current iteration's date is "after" the current return date
if (date.compareTo(returnDate) > 0){
returnDate=date;
}
}
}
return returnDate;
}
редактирование - мне также нравится ответ Treeset, но я думаю, что это могло бы быть немного медленнее, поскольку это эквивалентно сортировке данных, затем ищущих его => nlog (n) для сортировки, и затем документация подразумевает, что это - журнал (n) для доступа так, чтобы был бы nlog (n) +log (n) по сравнению с n
private Date getDateNearest(List<Date> dates, Date targetDate){
return new TreeSet<Date>(dates).lower(targetDate);
}
Не требует предварительно отсортированного списка, TreeSort фиксирует это. Это возвратит пустой указатель, если это не может найти тот, хотя, таким образом, необходимо будет изменить его, если это - проблема. Не уверенный в efficency также :P
Я в настоящее время использую следующий метод, но я не уверен, что это - самое эффективное, потому что это принимает уже отсортированный список и (потенциально) выполняет итерации по каждой дате в списке.
private Date getDateNearest(List<Date> dates, Date targetDate){
for (Date date : dates) {
if (date.compareTo(targetDate) <= 0) return date;
}
return targetDate;
}
Хотя ответ от Keeg действителен в 1,6 в 1,5 нет никакого метода ниже () (Мы неудачны разработать против 1,5 :-()
эти работы в 1,5
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.TreeSet;
public class GetNearestDate {
public static void main( String[] args ) throws ParseException {
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "dd.MM.yyyy HH:mm:ss" );
List< Date > otherDates = Arrays.asList( new Date[]{
simpleDateFormat.parse( "01.01.2008 01:00:00" ) ,
simpleDateFormat.parse( "01.01.2008 01:00:02" ) } );
System.out.println( simpleDateFormat.parse( "01.01.2008 01:00:00" ).equals(
get( otherDates , simpleDateFormat.parse( "01.01.2008 01:00:01" ) ) ) );
System.out.println( simpleDateFormat.parse( "01.01.2008 01:00:02" ).equals(
get( otherDates , simpleDateFormat.parse( "01.01.2008 01:00:03" ) ) ) );
System.out.println( null == get( otherDates , simpleDateFormat.parse( "01.01.2008 01:00:00" ) ) );
}
public static Date get( List< Date > otherDates , Date dateToApproach ) {
final TreeSet< Date > set = new TreeSet< Date >( otherDates );
set.add( dateToApproach );
final ArrayList< Date > list = new ArrayList< Date >( set );
final int indexOf = list.indexOf( dateToApproach );
if ( indexOf == 0 )
return null;
return list.get( indexOf - 1 );
}
}
Вы посмотрели на JodaTime API? Я, кажется, вспоминаю функцию как этот являющийся доступным.