2016-11-12 1 views
-2

Список дат, как указано ниже (Список может быть в любом порядке): 3-янв. 31-Mar, 2-апреля 30-Jun, 1-июл 30-сен 4-окт 31-декабряJava: данный список объектов, имеющих диапазон дат, найдет два объекта, конец которых ближе всего к текущей дате, месяц

Текущая дата: 19-февраля

Может кто-то пожалуйста, помогите мне с логика?

Мой подход:

если (данная дата должна быть больше, чем дата начала и меньше даты окончания) {// это дает текущий квартал} еще если (разница месяца текущей даты от даты окончания каждого объекта должна быть меньше или равна 5)

я жесткого кодирования состояние менее чем 5, которые могут сломаться, если в будущем диапазон даты будет 4 месяца

Второй подход:

мы можем сортировать список по возрастанию и получить индекс текущего квартала по сравнению с текущей датой, а следующий квартал будет следующего индекса. Но сложность будет больше.

Я пробовал под кодом, но он дает только текущую четверть даты. Я не могу получить следующий квартал, учитывая, что будет только 3 объекта, а текущий день месяца - feb.

общественности статический список getCurrentQtrOffr (подробно список, Дата CurrentDate) броски ParseException {

int currentQuarter = 9999, diff1; 
    int nextquarter = 9999, diff2; 
    Detail detail1; 
    Detail detail2; 
    Detail detail3 = null; 
    Detail detail4 = null; 
    Iterator<Detail> iterator = detail.iterator(); 

    List<Detail> list = new ArrayList<Detail>(); 

    while(iterator.hasNext()){ 
     detail1 = iterator.next();  
     diff1 = getDiff(currentDate,detail1.startTime()); 

     if(diff1>0){ 

     if(iterator.hasNext()){ 
     detail2 = iterator.next(); 
     }else{ 
     detail2 = null; 
     } 

     if(detail2 != null){ 
     diff2 = getDiff(currentDate,detail2.startTime()); 

     if(diff1 < diff2){ 
      if(currentQuarter > diff1){ 
      nextquarter = currentQuarter; 
      currentQuarter = diff1; 
      //how to assign detail3 before updating it with next minimum value, as if there will be only 3 object and flow comes in this if block then detail4 will be null 
      detail4=detail3; 
      detail3=detail1; 
      }else if(nextquarter > diff1){ 
      nextquarter = diff1; 
      detail4=detail1; 
      } 
     }else{ 

      if(currentQuarter > diff2){ 
       nextquarter = currentQuarter; 
       currentQuarter = diff2; 
       detail4=detail3; 
       detail3=detail1; 
      }else if(nextquarter > diff2){ 
       nextquarter = diff2; 
       detail4=detail1; 
      } 
     }   
    }else{ 
     if(currentQuarter > diff1){ 
      nextquarter = currentQuarter; 
      currentQuarter = diff1; 
      detail4=detail3; 
      detail3=detail1; 
     }else if(nextquarter > diff1){ 
      nextquarter = diff1; 
      detail4=detail1; 
     } 
    } 
    }else{ 
     System.out.println("skipped "+diff1); 
    } 
    } 
    list.add(detail3); 
    list.add(detail4); 
    return list; 
} 
+0

Что не так с вопросом, что оно отмечено отрицательным? – Rehan

+0

не может использовать календарь, поскольку диапазон дат может быть изменен. – Rehan

+2

Я не спустил вниз, но я предполагаю, что они занижены, потому что вы ничего не пробовали. Вы должны опубликовать то, что вы пробовали. Читайте: http://stackoverflow.com/help/mcve – BlackHatSamurai

ответ

1

Если периоды являются взаимоисключающими (не перекрывающихся) вы просто проверить первое вхождение где:

  • Цель равна или ниже начала, и ...
  • Цель перед остановкой.

Эта логика следует полуоткрытую подход, обычно используемый в дата-время работы, когда начало является включительно в то время как окончание эксклюзивные.

Более короткий способ сказать «цель равна или позже начала» «не раньше начала». Восклицательный знак ! означает not в синтаксисе Java.

Boolean periodContainsTarget = (! target.isBefore(start)) && target.isBefore(stop) ; 

выше логика будет использоваться с LocalDate, если вы имели в виду свидание с год. Если вы буквально означали месяц и день без года, используйте класс MonthDay. Логика работает для обоих.

Используйте класс Period для представления промежутка времени между парами LocalDate объектов. См. Tutorial.

Вы также можете найти полезный класс Interval в проекте ThreeTen-Extra, который дополняет java.time.

+0

Спасибо, что ответили! логика, о которой вы говорили, поможет получить первый ближайший квартал. Но мне нужен второй ближайший квартал. – Rehan

+0

Используйте класс ['Period'] (https://docs.oracle.com/javase/8/docs/api/java/time/Period.html) для представления промежутка времени между парой объектов LocalDate. См. [Учебник] (http://docs.oracle.com/javase/tutorial/datetime/iso/period.html). –

+0

Я не использую Java 8. Его плохой я делал простой логический комплекс, вместо того, чтобы повторять два объекта одновременно, когда я добрался до одного, и начал работать. Что-то вроде получения двух минимальных значений из списка или массива. Спасибо, Василий за ваше время! – Rehan

Смежные вопросы