2017-10-10 8 views
0

J'ai un tableau rapide ayant 5 éléments dans un certain ordre [A1, B2, C3, D4, E5] J'ai un autre tableau vide. 5 options qui sont présentes dans le premier tableau peuvent être entrées pour être insérées.Logique de commande de matrice

Lorsque les valeurs sont insérées, elles doivent être dans l'ordre du tableau de base. Disons d'abord D4 est insérée, alors D4 sera inséré dans le tableau [D4]

Si A1 est insérée, alors l'ordre du tableau sera [A1, D4] Si E5 est insérée, alors l'ordre du tableau sera [ A1, D4, E5]

Quelqu'un suggère gentiment une certaine logique pour le même.

+1

Quel est votre code essayé. Cela ressemble à un simple tri et des milliers de réponses sont affichées. –

+0

Je suspecte fortement que les tableaux de chaînes soient le mauvais modèle pour ce que vous essayez de faire. Si vous avez un ensemble fini d'options, utilisez une énumération! – Raphael

+0

En outre, pourquoi les valeurs sont-elles insérées dans un ordre différent du tableau de référence? Veuillez partager une partie du contexte pour que le problème que vous essayez de résoudre devienne clair. – Raphael

Répondre

0

C'est un ordre de tri indirect qui peut être mis en œuvre comme suit:

let base = ["A1", "B2", "C3", "D4", "E5"] 
let order = [String:Int](uniqueKeysWithValues: base.enumerated().map{($1,$0)}) 

var selection:[String] = [] 

func addToSelection(_ value:String) 
{ selection = (selection + [value]).sorted{order[$0]! < order[$1]!} } 

// adding values ... 
addToSelection("D4") // ["D4"] 
addToSelection("E5") // ["D4","E5"] 
addToSelection("A1") // ["A1","D4","E5"] 

.

Si vous utilisez Swift 3 (ou si vous préférez que la notation) le dictionnaire de l'ordre pourrait être initialisé comme ceci:

let order:[String:Int] = ["A1":1, "B2":2, "C3":3, "D4":4, "E5":5] 

.

.

Une autre façon qui ne comporte pas une sorte serait d'utiliser votre sélection comme un filtre sur le tableau de base:

let base ["A1", "B2", "C3", "D4", "E5"] 

var selection:[String] = [] 

func addToSelection(_ value:String) 
{ selection = base.filter{selection.contains($0) || $0 == value } } 

Mais cela revient en fait des éléments du tableau de base (pas de la sélection) qui peut être un problème si vous travaillez avec des objets plutôt que de simples chaînes.

+0

Merci Alain, ça a fonctionné parfaitement .. Oui on n'utilise que du String. –