1
votes

Comment identifier une liste triée

Je veux savoir si une liste "A" a déjà été triée par ses valeurs (dans un ordre strictement croissant). J'ai pensé faire une copie de la liste (=> "B") et la comparer à "A" triée par ses valeurs (en utilisant ASC ). Dans l'état actuel, je n'ai aucune idée de comment créer une copie d'une liste. Il existe peut-être un autre moyen plus simple de résoudre ce problème (en utilisant Cypher).


0 commentaires

3 Réponses :


0
votes

Il existe des fonctions de collecte dans les procédures APOC qui peut vous aider, en particulier apoc.coll.sort () et apoc.coll.sortNodes () selon qu'il s'agit de valeurs primitives ou de nœuds .

Quant à la création d'une copie de liste, vous pouvez utiliser une compréhension de liste pour effectuer une projection des éléments d'une liste comme ceci:

WITH [1,2,3,4,5] as list1
WITH list1, [n in list1 | n] as list2
...

En ce qui concerne les comparaisons , les comparaisons d'égalité entre les listes incluent l'ordre, donc pour ce qui précède, RETURN list1 = list2 serait vrai puisqu'elles contiennent les mêmes éléments dans le même ordre. Mais mélanger l'une des listes comme ceci: RETURN list1 = apoc.coll.shuffle (list2) renverrait false car l'ordre est différent.


0 commentaires

0
votes

Si vous ne voulez pas / ne pouvez pas utiliser APOC, vous pouvez trier la liste en utilisant

WITH [1,2,3,4] as list
WITH reduce(result = true, i in range(0,size(list)-2) | result AND list[i] <= list[i+1]) AS sorted
return sorted

C'est un peu maladroit car vous devez transférer toutes les variables dont vous avez besoin dans toutes les instructions WITH .

Exemple:

╒═════════╤═════════╤═════════════╕
│"list"   │"sorted" │"list=sorted"│
╞═════════╪═════════╪═════════════╡
│[1,2,3,1]│[1,1,2,3]│false        │
└─────────┴─────────┴─────────────┘

renvoie

WITH [1,2,3,1] as list
UNWIND list as item
WITH list,item ORDER BY item
WITH list,collect(item) as sorted 
return list,sorted,list=sorted

Cependant

╒═════════╤═════════╤═════════════╕
│"list"   │"sorted" │"list=sorted"│
╞═════════╪═════════╪═════════════╡
│[1,2,3,4]│[1,2,3,4]│true         │
└─────────┴─────────┴─────────────┘

renvoie

WITH [1,2,3,4] as list
UNWIND list as item
WITH list,item ORDER BY item
WITH list,collect(item) as sorted 
return list,sorted,list=sorted

Ou vous pouvez utiliser la fonction réduire , ceci évite de trier la liste et effectue une itération sur la liste une seule fois:

    UNWIND list as item
    WITH list,item ORDER BY item


0 commentaires

1
votes

Vous pouvez tester directement la liste d'origine, ce qui devrait être plus rapide et utiliser moins de ressources que de faire un nouveau tri et / ou de créer une copie de la liste.

Par exemple, cela retournera true:

WITH [1,2,3,4] AS list
RETURN ALL(i IN RANGE(1, SIZE(list)-1) WHERE list[i-1] <= list[i]) AS inOrder

Et si list était [4,1,2,3] code >, alors la requête ci-dessus renverrait false.


0 commentaires