2015-09-22 3 views
0

Я занят добавлением функциональности, которая добавляет начальную и конечную даты к оплате услуг. В настоящее время плата за обслуживание содержит минимальную сумму снятия средств, плату и даты начала и окончания.Ограничить количество отдельных элементов за любой заданный период времени

Требование состоит в том, что вы можете иметь несколько разных минимальных сумм снятия средств со своим периодом (даты начала и окончания). Элементы с одинаковой минимальной суммой изъятия допускают, что их периоды перекрываются, хотя допускаются пробелы. Заключительным требованием является то, что вы можете установить сумму различных минимальных сумм снятия денег в любой момент времени, то есть если сумма установлена ​​в 5, вы можете иметь 5 различных сборов за обслуживание в любой данный момент времени.

Теперь моя проблема - это последняя часть, убедившись, что в любой момент времени действует только определенное количество периодов.

И сделать вещи еще более сложно .. я не могу использовать класс Calendar, потому что я делаю это в GWT, который поддерживает только класс Date ..

Вот что я до сих пор ..

private boolean checkDates() { 
    int maxSlates = orgs.getMaxSlates(); 
    for (WfScServiceCharge wfsc : serviceCharges) { 
    Date startDate = wfsc.getScEffectiveStart(); 
    Date endDate = wfsc.getScEffectiveEnd(); 
    int slates = 0; 

    for (WfScServiceCharge wfsc2 : serviceCharges) { 
     // dont check slate against itself 
     if (!wfsc.equals(wfsc2)) { 

     // check slates with same min withdraw amounts 
     if (wfsc.getScMinWithdrawAmount() == wfsc2.getScMinWithdrawAmount()) { 
      // check that periods dont overlap 
      if ((startDate.after(wfsc2.getScEffectiveStart()) && startDate 
       .before(wfsc2.getScEffectiveEnd())) 
       || (endDate.after(wfsc2.getScEffectiveStart()) && endDate 
        .before(wfsc2.getScEffectiveEnd()))) { 
      Window 
       .alert("Period clashes with an already configured" 
        + " period for a service charge with the same minimum withdrawal amount."); 
      return false; 
      } 
     } 

     // check number of distinct slates for any given period 
     // THIS IS WHERE I NEED HELP! 
     if (wfsc2.getScEffectiveStart().compareTo(startDate) >= 0 
      || wfsc2.getScEffectiveEnd().compareTo(endDate) <= 0) { 
      slates++; 
     } 
     if (slates > maxSlates) { 
      Window.alert("Maximum amount of slates reached for time period. " 
       + "Please change the period that this slate needs to fall in."); 
      return false; 
     } 
     } 

    } 
    } 
    return true; 
} 

ответ

0

Звучит так, как будто вы строите IntervalTree. Он принимает диапазоны и позволяет запросить, сколько диапазонов пересекает определенную точку. Вы можете пройти все начальные и конечные точки в данных, чтобы найти свои счета.