Календарь: отключить выбор определенных дней - PullRequest
1 голос
/ 04 марта 2010

Я пытался понять, как решить эту проблему, с которой я столкнулся. Мне нужно найти способ проверить, какой день был выбран в календаре, и посмотреть, можно ли кликнуть что-нибудь вокруг него. Другими словами, если дата выбрана после выбранной даты, она не может идти дальше.

Вот пример:

Скажите, что в марте и марте всего 31 день. Пользователь выбирает день 9. Поэтому дни 1-8 не выбираются (я уже закодировал эту часть)

Теперь скажите, что 10-й день нельзя выбрать, поскольку он уже чем-то занят В этом случае пользователю не будет разрешено нажимать любую другую дату после 9-го числа, поскольку он не может пересекать день, который уже был занят чем-либо.

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

[10,15,20]

Как и в случае выше, я знаю, какие дни нельзя выбрать, но я не уверен, что делать с их кодированием, если пользователь (опять же, в приведенном выше примере) выбирает день 11, и это пересекает день 10, который уже нельзя выбрать .

Вот изображение этого: http://img704.imageshack.us/img704/9803/cals.jpg

Любая помощь и идеи будут великолепны!

Спасибо, David

Хорошо, с помощью ASP я решил большую часть проблемы:

 sVal = tempResults 'This is the array of used dates already
 tmpDate = tmpDate + 1 'This is the date they chose (9) and added a 1 making it 10 (next day)
 theMonthDays = getDaysInMonth(theMonth, theYear) ' This just gets how many days are in the current selected month
 ArrayOfValues = Split(sVal, ",") 'this splits the array of used dates to be checked below

 For i = 0 To UBound(ArrayOfValues)     
    if tmpDate = CInt(ArrayOfValues(i)) then 'if it finds a date used already then block the rest
        dim z, theBlockedDays

        z = tmpDate
        do until z = theMonthDays + 1
            theBlockedDays = "'" & theMonth & "-" & z & "-" & theYear & "'," & theBlockedDays
            z = z + 1
        loop
        exit for
    end if
Next

Теперь это работает для 9-го дня, но не работает, если я выбираю 11-й день, так как следующий день открыт, а затем также и день после этого. Как мне проверить это?

David

1 Ответ

1 голос
/ 04 марта 2010

Дайте мне посмотреть, ясно ли я понимаю вашу проблему.

Допустим, заблокированные даты d0, d1, d2, ...dn в порядке возрастания.

Затем, когда пользователь выбирает дату k, которая не является заблокированной, вы:

  • Заблокировать даты [1..k] (вы сказали, что уже сделали эту часть)
  • Даты блокирования [dj..31], где j является самым низким, так что dj > k.

Так как же найти dj? Ну, в общем, это та проблема, для которой предназначен бинарный поиск. Вы уже отсортировали d0, d1, ...dn, поэтому бинарный поиск найдет dj в O(log n). Однако, поскольку мы говорим о календарных датах, существует только 31 возможное число, поэтому линейный поиск также не повредит.

Вот простой код, с которого вы можете начать:

<script>

function search(v, a) {
  for (var i = 0; i < a.length; i++) {
    if (a[i] > v) {
      return a[i];
    }
  }
  return Infinity;
}

alert(search(5, [10, 15, 20]));  // 10 --> block out [10..31]
alert(search(12, [10, 15, 20])); // 15 --> block out [15..31]
alert(search(17, [10, 15, 20])); // 20 --> block out [20..31]
alert(search(25, [10, 15, 20])); // Infinity --> blockout [Infinity..31], i.e. nothing

</script>
...