72 votes

Comment réorganiser les éléments d'un tableau vers une nouvelle position en Swift ?

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] .

137voto

Luka Jacobowitz Points 3990

Swift 3.0+ :

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
}

Swift 2.0 :

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]

1 votes

Est-ce que swift gère efficacement ce type de retrait et d'insertion ?

1 votes

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 :)

1 votes

Cette dernière ligne ne devrait-elle pas se lire fromIndex:2 ? 3 est le 3ème élément à l'index SECOND

57voto

Ian Bytchek Points 1247

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)
    }
}

GIF

1 votes

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.

0 votes

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 ?

0 votes

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] .

42voto

Leo Dabus Points 122890

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]

1 votes

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)

0 votes

Insert(remove...) que faire si l'élément n'existe pas ?

1 votes

Il y a une condition préalable

23voto

ingconti Points 405

Bon conseil de la part de Leo.

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)

5voto

Muhammad Yawar Ali Points 1893

Nous pouvons utiliser la méthode swap pour échanger des éléments dans un tableau :

var arr = ["one", "two", "three", "four", "five"]

// Swap elements at index: 2 and 3
print(arr)
swap(&arr[2], &arr[3])
print(arr)

1 votes

Ma question est de savoir comment réorganiser l'article et non pas échanger 2 articles.

0 votes

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.

0 votes

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.com

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.

Powered by:

X