Разделение массива целых чисел на несколько целочисленных массивов в зависимости от конкретного условия - PullRequest
0 голосов
/ 26 октября 2018

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

Input - [1,2,3,4,5,6,7,8,9]
Output - [1,2,3,4],[5,6],[7,8],[9] ==> Split the array as soon as the sum of elements is greater than 8

Можно ли добиться этого в запросе Cypher?

Спасибо, Вишал

1 Ответ

0 голосов
/ 26 октября 2018

Это можно сделать в Cypher, но код может быть немного пугающим: -).

Например, этот запрос:

WITH [1,2,3,4,5,6,7,8,9] AS input
RETURN REDUCE(s = {sum:0, res:[]}, x IN input | CASE
  WHEN s.sum + x > 8 THEN CASE
    WHEN s.sum = 0 THEN {sum:0, res:s.res+[[x]]}
    ELSE {sum:0, res:s.res[..-1]+[s.res[-1]+x]} END
  ELSE CASE
    WHEN s.sum = 0 THEN {sum:s.sum+x, res:s.res+[[x]]}
    ELSE {sum:s.sum+x, res:s.res[..-1]+[s.res[-1]+[x]]} END
  END
).res AS result

дает такой результат:

╒═══════════════════════════╕
│"result"                   │
╞═══════════════════════════╡
│[[1,2,3,4],[5,6],[7,8],[9]]│
└───────────────────────────┘

Примечание: в приведенном выше запросе последний подсписок всегда будет содержать остаток от входного списка, и его сумма не обязательно будет превышать 8. Если сумма последнего подсписка также должна превышать 8, тоэтот модифицированный запрос:

WITH [1,2,3,4,5,6,7,8,8] AS input, 8 AS bound
WITH bound, REDUCE(s = {sum:0, res:[]}, x IN input | CASE
  WHEN s.sum + x > bound THEN CASE
    WHEN s.sum = 0 THEN {sum:0, res:s.res+[[x]]}
    ELSE {sum:0, res:s.res[..-1]+[s.res[-1]+x]} END
  ELSE CASE
    WHEN s.sum = 0 THEN {sum:s.sum+x, res:s.res+[[x]]}
    ELSE {sum:s.sum+x, res:s.res[..-1]+[s.res[-1]+[x]]} END
  END
).res AS res
RETURN CASE
  WHEN REDUCE(t=0, y IN res[-1] | t+y) > bound THEN res
  ELSE res[..-1] END AS result

дает такой результат:

╒═══════════════════════╕
│"result"               │
╞═══════════════════════╡
│[[1,2,3,4],[5,6],[7,8]]│
└───────────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...