2017-08-29 1 views
0

je le code suivant dans mon terrain de jeu:Index des cas précis dans le tableau rapide/collection

let array = [3,3] 
let first = array.first! 
let last = array.last! 

let indices = [array.index(of: first)!, array.index(of: last)!] 
print(indices) // This prints [0,0] 

Je comprends que la méthode « index (de :) » attrape juste la première instance correspondant du tableau, ce qui est plus efficace, mais je me demande s'il existe un moyen de récupérer ce dernier index basé sur le fait que j'ai obtenu la valeur de "array.last".

De plus, si j'avais les suivantes:

let lotsOfThrees = [3,3,3,3,3,3,3] 
let fourthThree = lotsOfThrees[3] 
// Write code to return the index of "fourthThree" (possibly based on memory address) 

Je me demande s'il y a un moyen de faire fonction de l'adresse de la mémoire, mais honnêtement pas sûr.

+0

Je ne comprends pas ce que vous essayez de faire; l'index de "thirdThree" est '3' - vous l'avez déjà. De même, dans votre premier code, l'index du premier 3 est '0' et l'index du dernier est' array.count-1'. '3' est une valeur, donc il n'y a pas de" 3 "spécifique dans le tableau; Ils sont tous les mêmes. – Paulw11

+0

Eh bien, je me demande s'il existe un moyen de lier les références ensemble. Comme si j'effectuais d'autres opérations, ou passais ces valeurs dans une fonction, et donc je ne sais pas que "fourthThree" est l'index 3, je sais juste que c'est un 3 avec une adresse mémoire. Est-il possible d'associer cela avec le quatrième objet dans le tableau "lotsOfTrois". De préférence avec une fonction de bibliothèque. Je veux fondamentalement savoir s'il y a n'importe quelle fonction de bibliothèque qui me permettrait de repasser array.last et le distinguer de array.first s'ils ont la même valeur – RDSpinz

+1

Pourquoi avez-vous besoin de ceci? Quel problème essayez-vous réellement de résoudre avec ceci? – rmaddy

Répondre

0

Vous pouvez obtenir le dernier indice d'un élément en inversant le tableau, puis obtenir l'index de la première occurrence . L'index du dernier élément dans le tableau original est alors (index de la première occurrence dans le tableau inversé) - (taille du tableau) - 1. Mettez-le dans une méthode d'extension pour plus de plaisir.

extension Array<T> { 
    func lastIndex(of item: T) -> Int? { 
     if let lastIndex = self.reverse().index(of: item) { 
      return self.count() - lastIndex - 1 
     } else { 
      return nil 
     } 
    } 
} 
0

Je suggère d'utiliser enumerated() et filter pour apparier indices avec la valeur que vous recherchez:

let lotsOfThrees = [3, 3, 3, 3, 3, 3, 3] 
let threesAndIndices = lotsOfThrees.enumerated().filter { $1 == 3 } 
print(threesAndIndices) 
[(offset: 0, element: 3), (offset: 1, element: 3), (offset: 2, element: 3), (offset: 3, element: 3), (offset: 4, element: 3), (offset: 5, element: 3), (offset: 6, element: 3)] 
// find index of last three 
print(threesAndIndices.last!.offset) 
6 
// find index of 4th three 
print(threesAndIndices[4 - 1].offset) 
3 

Vous devriez vérifier la taille du tableau et ne pas supposer qu'il existe une dernière valeur comme ceci:

let values = [1, 3, 2, 4, 1, 3, 3, 4, 1] 
let threesAndIndices = values.enumerated().filter { $1 == 3 } 

// find index of last three 
if let last = threesAndIndices.last { 
    print("index of last three is \(last.offset)") 
} else { 
    print("there are no threes") 
} 
index of last three is 6 
// find index of 4th three 
let nth = 4 
if nth > threesAndIndices.count { 
    print("there aren't \(nth) threes") 
} else { 
    let index = threesAndIndices[nth - 1].offset 
    print("the index of three #\(nth) is \(index)") 
} 
there aren't 4 threes