web-dev-qa-db-fra.com

Comment inverser un tableau dans Swift sans utiliser ".reverse ()"?

J'ai un tableau et j'ai besoin de l'inverser sans la méthode Array.reverse, uniquement avec une boucle for.

var names:[String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]
14
Milos Mandic

Voici la réponse de @Abhinav traduite en Swift 2.2 :

var names: [String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]

var reversedNames = [String]()

for arrayIndex in (names.count - 1).stride(through: 0, by: -1) {
    reversedNames.append(names[arrayIndex])
}

L'utilisation de ce code ne devrait pas vous donner d'erreur ni d'avertissement concernant l'utilisation obsolète des boucles for style C ou l'utilisation de --.

Swift 3:

var names: [String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]

var reversedNames = [String]()

for arrayIndex in stride(from: names.count - 1, through: 0, by: -1) {
    reversedNames.append(names[arrayIndex])
}

Vous pouvez également effectuer une boucle normale et soustraire à chaque fois:

var names: [String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]

var reversedNames = [String]()

for arrayIndex in 0..<names.count {
    reversedNames.append(names[(names.count - 1) - arrayIndex])
}
9
ZGski

Swift 3:  

var names:[String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]

var reversedNames : [String] = Array(names.reversed())

print(reversedNames)  // ["Asus", "Lenovo", "Sony", "Microsoft", "Apple"]
7
user44776

¿C'est un must pour for loop? Si non, vous pouvez utiliser reduce

Je suppose que c’est le moyen le plus rapide de le réaliser sans la méthode inversée () ( Swift 3.0.1 ):

["Apple", "Microsoft", "Sony", "Lenovo", "Asus"].reduce([],{ [$1] + $0 })
6
brunobasas
var names:[String] = [ "A", "B", "C", "D", "E","F","G"]
var c = names.count - 1
var i = 0
while i < c {
    swap(&names[i++],&names[c--])
}
4
user3441734

Voici:

var names:[String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]

var reversedNames = [String]()

for var arrayIndex = names.count - 1 ; arrayIndex >= 0 ; arrayIndex-- {
    reversedNames.append(names[arrayIndex])
}
3
Abhinav

Voici le code pour Swift 3

let array = ["IOS A", "IOS B", "IOS C"]
    for item in array.reversed() {
    print("Found \(item)")
    }
2
iOS

Seulement besoin de faire (names.count/2) passe à travers le tableau. Pas besoin de déclarer une variable temporaire, lors de l'échange ... c'est implicite.

var names:[String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]
let count = names.count
for i in 0..<count/2 {
   (names[i],names[count - i - 1])  = (names[count - i - 1],names[i])
}
// Yields: ["Asus", "Lenovo", "Sony", "Microsoft", "Apple"]
2
Mike Chirico

Il existe également stride pour générer un index inversé:

let names = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]

var reversed = [String]()

for index in (names.count - 1).stride(to: -1, by: -1) {
    reversed.append(names[index])
}

Cela fonctionne aussi bien avec map:

let reversed = (names.count - 1).stride(to: -1, by: -1).map { names[$0] }

Note: stride commence son index à 1, pas à 0, contrairement aux autres séquences de Swift.

Cependant, pour tous ceux qui liront ceci dans le futur: utilisez .reverse()au lieu d’inverser réellement un tableau, c’est la méthode prévue.

2
ayaio

Ignorer les contrôles pour le vide ..

var names:[String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]

var reversedNames: [String]
reversedNames = []

for name in names {
    reversedNames.insert((name), atIndex:0)
}
1
Pilkie

tu veux dire

var names = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]
var newNames = [String]()

for var i = names.count - 1; i >= 0 ; i-- {
  newNames.append(names[i])
}
names = newNames

ou 

names.map {newNames.insert($0, atIndex: 0)}
names = newNames
1
vadian

Comme ça, peut-être: 

names = names.enumerate().map() { ($0.index, $0.element) }.sort() { $0.0 > $1.0 }.map() { $0.1 }

Oh, attends .. Je ai à utiliser for boucle, non? Alors comme ceci probablement:

for (index, name) in names.enumerate().map({($0.index, $0.element)}).sort({$0.0 > $1.0}).map({$0.1}).enumerate() {
    names[index] = name
}
1
courteouselk

Voici comment je l'ai fait et il n'y a pas d'avertissement pour Swift 3 

let names = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]
var reversedNames = [String]()

for name in names.enumerate() {
  let newIndex = names.count - 1 - name.index
  reversedNames.append(names[newIndex])
}

ou tout simplement 

reversedNames = names.reverse()
0
Pavle Mijatovic

Cela fonctionnera avec n'importe quel tableau de taille.

import Cocoa

var names:[String] = [ "A", "B", "C", "D", "E","F"]
var c = names.count - 1
for i in 0...(c/2-1) { swap(&names[i],&names[c-i]) }

print(names)
0
Simon O'Doherty
var rArray : [Int] = [2,5,6,8,3,8,9,10]
var ReArray = [Int]()
var a : Int = 1

func reversed (_ array: [Int]) -> [Int] {
    for i in array {
        ReArray.append(array[array.count-a])
        a += 1
    }

    rArray = ReArray

    return rArray
}

reversed(rArray)

print(rArray)
0
md.rayhan_bhuiyan

Pour le plaisir, une autre option utilisant append au lieu de insert (atIndex :):

var names:[String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]
if !names.isEmpty {
    for index in 0...names.count-1 {
        names.append(names.removeAtIndex(names.count-1 - index))
    }
}
print(names)  // ["Asus", "Lenovo", "Sony", "Microsoft", "Apple"]\n"
0
Leo Dabus

Juste pour le plaisir:

var names:[String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]
if !names.isEmpty {
    for index in 0...names.count-1 {
       names.insert(names.removeAtIndex(index), atIndex: 0)
    }
}
print(names)  // ["Asus", "Lenovo", "Sony", "Microsoft", "Apple"]\n"
0
Leo Dabus
func reverse(array: inout [String]) {
    if array.isEmpty { return }
    var f = array.startIndex
    var l = array.index(before: array.endIndex)
    while f < l {
        swap(array: &array, f, l)
        array.formIndex(after: &f)
        array.formIndex(before: &l)
    }
}

private func swap( array: inout [String], _ i: Int, _ j: Int) {
    guard i != j else { return }
    let tmp = array[i]
    array[i] = array[j]
    array[j] = tmp
}

Ou vous pouvez écrire une extension bien sûr

0
Aleksey Kornienko

Voici le moyen le plus simple.

let names:[String] = ["Apple", "Microsoft", "Sony", "Lenovo", "Asus"]

var reversedNames = [String]()

for name in names {
    reversedNames.insert(name, at: 0)
}
0
Muhammad Khan