Considérons le tableau [1,2,3,4]
. Comment puis-je réorganiser les éléments du tableau vers une nouvelle position.
Par exemple :
put 3 into position 4 [1,2,4,3]
put 4 in to position 1 [4,1,2,3]
put 2 into position 3 [1,3,2,4]
.
Considérons le tableau [1,2,3,4]
. Comment puis-je réorganiser les éléments du tableau vers une nouvelle position.
Par exemple :
put 3 into position 4 [1,2,4,3]
put 4 in to position 1 [4,1,2,3]
put 2 into position 3 [1,3,2,4]
.
let element = arr.remove(at: 3)
arr.insert(element, at: 2)
et sous forme de fonction :
func rearrange<T>(array: Array<T>, fromIndex: Int, toIndex: Int) -> Array<T>{
var arr = array
let element = arr.remove(at: fromIndex)
arr.insert(element, at: toIndex)
return arr
}
Le chiffre 3 se retrouve ainsi en position 4.
let element = arr.removeAtIndex(3)
arr.insert(element, atIndex: 2)
Vous pouvez même créer une fonction générale :
func rearrange<T>(array: Array<T>, fromIndex: Int, toIndex: Int) -> Array<T>{
var arr = array
let element = arr.removeAtIndex(fromIndex)
arr.insert(element, atIndex: toIndex)
return arr
}
Les var
arr
est nécessaire ici, car vous ne pouvez pas modifier le paramètre d'entrée sans spécifier qu'il s'agit de in-out
. Dans notre cas, cependant, nous obtenons des fonctions pures sans effets secondaires, ce qui est beaucoup plus facile à raisonner, à mon avis. Vous pourriez alors l'appeler comme ceci :
let arr = [1,2,3,4]
rearrange(arr, fromIndex: 2, toIndex: 0) //[3,1,2,4]
Dans la plupart des cas, oui, si vous le faites BEAUCOUP, cela peut vous poser des problèmes, mais je ne m'en inquiéterais pas, à moins que ce ne soit un véritable goulot d'étranglement dans votre application :)
Cette dernière ligne ne devrait-elle pas se lire fromIndex:2 ? 3 est le 3ème élément à l'index SECOND
Toutes les réponses sont excellentes ! Voici une réponse plus complète Swift 5 Cette solution a été conçue dans un souci de performance et constitue un bonus pour les amateurs d'analyses comparatives et de GIF.
extension Array where Element: Equatable
{
mutating func move(_ element: Element, to newIndex: Index) {
if let oldIndex: Int = self.firstIndex(of: element) { self.move(from: oldIndex, to: newIndex) }
}
}
extension Array
{
mutating func move(from oldIndex: Index, to newIndex: Index) {
// Don't work for free and use swap when indices are next to each other - this
// won't rebuild array and will be super efficient.
if oldIndex == newIndex { return }
if abs(newIndex - oldIndex) == 1 { return self.swapAt(oldIndex, newIndex) }
self.insert(self.remove(at: oldIndex), at: newIndex)
}
}
La documentation indique : "L'appel à swapAt( : :) ayant le même indice que i et j n'a pas d'effet." Je pense que cela signifie que la ligne if oldIndex == newIndex { return }
n'est pas nécessaire ici. EDIT : Ok, j'ai réfléchi à nouveau. Si vous gardez la ligne, abs(newIndex - oldIndex)
n'est pas inutilement calculée.
Quelqu'un peut-il expliquer pourquoi ne pas utiliser swapAt
dans tous les cas et non pas seulement lorsqu'ils sont côte à côte. L'utilisation de insert/remove
une meilleure solution pour ces cas ?
Considérer [A, B, C, D]
. Déplacement d'un élément à l'index 3
a 0
vous donne [D, A, B, C]
. Remplacement d'un élément à l'index 3
a 0
vous donne [D, B, C, A]
.
Modifier/mettre à jour : Swift 3.x
extension RangeReplaceableCollection where Indices: Equatable {
mutating func rearrange(from: Index, to: Index) {
precondition(from != to && indices.contains(from) && indices.contains(to), "invalid indices")
insert(remove(at: from), at: to)
}
}
var numbers = [1,2,3,4]
numbers.rearrange(from: 1, to: 2)
print(numbers) // [1, 3, 2, 4]
Sympa, pour Swift 3 : extension Array { mutating func rearrange(from : Int, to : Int) { insert(remove(at : from), at : to) } } var myArray = [1,2,3,4] myArray.rearrange(from : 1, to : 2) print(myArray)
Les deux sont identiques car vous voulez déplacer des éléments d'un index à l'autre et l'échange est un meilleur moyen, je pense.
Um. [1,2,3,4,5] en intervertissant 3 et 5, on obtient [1,2,5,4,3] mais je veux [1,2,4,5,3], ce qui revient à déplacer l'élément à l'index 2 dans l'index 4.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.