Как я храню заказы?

Следующий код потока Java 8+:

long allWorkingMinutes = IntStream.range(0, allDaysBetween)
        .filter(i -> isWorkingDay(from.plusDays(i)))
        .count() * WORKING_MINUTES_PER_DAY ;

Такой же, как этот общий код, который будет работать в любой версии Java:

long count = 0;
for (int i = 0; i < allDaysBetween; i++)
    if (isWorkingDay(from.plusDays(i)))
        count++;
long allWorkingMinutes = count * WORKING_MINUTES_PER_DAY ;

Что касается ChronoUnit , Классы LocalDateTime и DayOfWeek используют ThreeTen Backport для поддержки Java SE 6 и 7.

12
задан Machavity 17 August 2017 в 16:13
поделиться

6 ответов

Обычно я добавлю интервал, или smallint столбец назвал что-то как 'Порядковый' или 'PositionOrdinal', как Вы предполагаете, и с точным протестом Вы упоминаете — потребность обновить потенциально значительное количество записей каждый раз, когда единственная запись переупорядочивается.

Преимущество - это, учитывая ключ для определенной задачи и новое положение для той задачи, код для перемещения объекта является всего двумя операторами:

UPDATE `Tasks` SET Ordinal= Ordinal+1 WHERE Ordinal>=@NewPosition
UPDATE `Tasks` SET Ordinal= @NewPosition WHERE TaskID= @TaskID

Существуют другие предложения для двунаправленного связанного списка или лексического порядка. Любой может быть быстрее, но за счет намного более сложного кода и производительности будет только иметь значение, когда у Вас есть много объектов в той же группе.

Или производительность или сложность кода более важны, будет зависеть от Вашей ситуации. Если у Вас есть миллионы записей, дополнительная сложность могла бы стоящий того. Однако я обычно предпочитаю более простой код, потому что пользователи обычно только заказывают маленькие списки вручную. Если нет всего, что много объектов в списке дополнительные обновления не будут иметь значения. Это может обычно обрабатывать тысячи записей без любого значимого влияния в производительности.

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

9
ответ дан 2 December 2019 в 05:42
поделиться

Можно сохранить заказы как литералы и использовать лексический вид:

1. A
2. Z

Добавьте задачу:

1. A
3. L
2. Z

Добавьте больше:

1. A
4. B
3. L
2. Z

Переместитесь 2 между 1 и 4:

1. A
2. AL
4. B
3. L

и т.д.

Вы обновляете только одну запись за один раз: просто возьмите среднюю букву между первыми, которые отличаются: если Вы помещаете между A и C, Вы берете B, если Вы помещаете между ALGJ и ALILFG, Вы берете ALH.

Буква рядом с существующими количествами как существующие связанный с тем рядом с Z. Т.е. если Вы должны поместить между ABHDFG и ACSDF, Вы считаете его как между ABH и AB(Z+), и запишите AB(letter 35/2), это ABP.

Если у Вас заканчивается длина строки, можно всегда выполнять полное переупорядочивание.

Обновление:

Можно также сохранить данные как связанный список.

См. статью в моем блоге о том, как выполнить в нем MySQL:

Вкратце:

/* This just returns all records in no particular order */

SELECT  *
FROM    t_list

id      parent
------- --------
1       0
2       3
3       4
4       1

/* This returns all records in intended order */

SELECT  @r AS _current,
        @r := (
        SELECT  id
        FROM    t_list
        WHERE   parent = _current
        )
FROM    (
        SELECT  @r := 0
        ) vars,
        t_list

_current id
-------  --------
0        1
1        4
4        3
3        2

При перемещении объектов необходимо будет обновить самое большее 4 строки.

Это, кажется, самый эффективный способ сохранить заказанный список, который часто обновляется.

14
ответ дан 2 December 2019 в 05:42
поделиться

Из Ваших ответов я придумал смесь, которая идет следующим образом:

Скажите, что мы имеем:

  • 1Example (1)
  • 2Example (2)
  • 3Example (3)
  • 4Example (4)
  • 5Example (5)

Теперь, если бы я сортирую что-то между 4, и 5 это было бы похоже на это:

  • 2Example (2)
  • 3Example (3)
  • 4Example (4)
  • 1Example (4.5)
  • 5Example (5)

теперь снова что-то между 1 и 5

  • 3Example (3)
  • 4Example (4)
  • 1Example (4.5)
  • 2Example (4.75)
  • 5Example (5)

это будет всегда брать половину различия между числами

Я надеюсь, что работы исправьте меня ;)

2
ответ дан 2 December 2019 в 05:42
поделиться

Мы делаем это со столбцом Sequence в базе данных.

Мы используем редкую нумерацию (например, 10, 20, 30...), таким образом, мы можем "вставить" один между существующими значениями. Если смежные строки имеют последовательные числа, мы перенумеровываем минимальное количество строк, мы можем.

Вы могли, вероятно, использовать Десятичные числа - берут среднее число Порядковых номеров для строк, смежных туда, где Вы вставляете, затем только необходимо обновить "перемещаемую" строку

1
ответ дан 2 December 2019 в 05:42
поделиться

Это не легкая проблема. Если бы у Вас есть небольшое число поддающихся сортировке элементов, я просто сбросил бы всех их к их новому порядку.

Иначе кажется, что потребовалась бы такая же работа или больше к "тесту-и-набору" для изменения только записей, которые изменились.

Вы могли делегировать эту работу к клиентскому. Сделайте, чтобы клиент поддержал старый порядок сортировки и новый порядок сортировки и определил, какая строка [порядок сортировки] должна быть обновлена - затем передает те кортежи интерфейсу PHP-mySQL.

Вы могли улучшить этот метод следующим образом (не требует плаваний):

  1. Если все поддающиеся сортировке элементы в списке будут инициализированы к порядку сортировки согласно их положению в списке, установите порядок сортировки каждого элемента к чему-то как строка [порядок сортировки] = строка [порядок сортировки * K], где K является некоторым числом> среднее количество раз, то Вы ожидаете, что список будет переупорядочен. O (N), N=number элементов, но способность вставки увеличений, по крайней мере, N*K с, по крайней мере, K открытые слоты между каждой парой выхода элементов.

  2. Затем, если Вы хотите вставить элемент между двумя другими его столь же простой как изменение его порядка сортировки, чтобы быть тем, который является> более низкий элемент и <верхнее. Если нет никакой "комнаты" между элементами, можно просто повторно применить алгоритм "распространения" (1) представленный в предыдущем абзаце. Чем больший K, тем менее часто он будет применен.

Алгоритм K был бы выборочно применен в Сценарии PHP, в то время как выбор нового порядка сортировки будет сделан клиентом (JavaScript, возможно).

1
ответ дан 2 December 2019 в 05:42
поделиться

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

надежда, которая имеет смысл..., конечно, это зависит от Ваших правил для переупорядочения.

0
ответ дан 2 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

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