Лучший способ найти дату ближайшей для предназначения в списке дат?

У меня нет большого опыта работы с Onboard SDK, но в теории я считаю, что ответ - да, ваш подход должен работать.

Я сделал нечто подобное в противоположном случае, используя мобильный SDK и sendDataToOnboardSDKDevice (см. Мой в настоящее время оставшийся без ответа вопрос ) и через другие мобильные обратные вызовы (startMission, SdCardCallbacks и т.д.), где изменить глобальную переменную, и он обновляет что-то в другом месте.

Итак, в принципе, ответ да, но я не знаю достаточно о встроенном sdk (c ++?), Чтобы знать, что ваш конкретный код реализован правильно.

6
задан Aleksandar Dimitrov 9 October 2008 в 09:47
поделиться

5 ответов

Решение 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

    6
    ответ дан 8 December 2019 в 14:49
    поделиться
    private Date getDateNearest(List<Date> dates, Date targetDate){
        return new TreeSet<Date>(dates).lower(targetDate);
    }
    

    Не требует предварительно отсортированного списка, TreeSort фиксирует это. Это возвратит пустой указатель, если это не может найти тот, хотя, таким образом, необходимо будет изменить его, если это - проблема. Не уверенный в efficency также :P

    6
    ответ дан 8 December 2019 в 14:49
    поделиться

    Я в настоящее время использую следующий метод, но я не уверен, что это - самое эффективное, потому что это принимает уже отсортированный список и (потенциально) выполняет итерации по каждой дате в списке.

    private Date getDateNearest(List<Date> dates, Date targetDate){
      for (Date date : dates) {
        if (date.compareTo(targetDate) <= 0) return date;
      }
    
      return targetDate;
    }
    
    2
    ответ дан 8 December 2019 в 14:49
    поделиться

    Хотя ответ от 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 );
      }
    
    }
    
    1
    ответ дан 8 December 2019 в 14:49
    поделиться

    Вы посмотрели на JodaTime API? Я, кажется, вспоминаю функцию как этот являющийся доступным.

    0
    ответ дан 8 December 2019 в 14:49
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: