Jestem tak zdezorientowany co do tablic 2D w Swift. Opiszę krok po kroku. Czy mógłbyś mnie poprawić, jeśli się mylę.
Po pierwsze; deklaracja pustej tablicy:
class test{
var my2Darr = Int[][]()
}
Po drugie wypełnij tablicę. (np. my2Darr[i][j] = 0
gdzie i, j są zmiennymi pętli for)
class test {
var my2Darr = Int[][]()
init() {
for(var i:Int=0;i<10;i++) {
for(var j:Int=0;j<10;j++) {
my2Darr[i][j]=18 /* Is this correct? */
}
}
}
}
I na koniec Edycja elementu in array
class test {
var my2Darr = Int[][]()
init() {
.... //same as up code
}
func edit(number:Int,index:Int){
my2Darr[index][index] = number
// Is this correct? and What if index is bigger
// than i or j... Can we control that like
if (my2Darr[i][j] == nil) { ... } */
}
}
var my2DArray = Array(count: 10, repeatedValue: Array(count: 10, repeatedValue: 18))
Naprawdę powinieneś uaktualnić do nowszej wersji beta.Int[][]()
nie jest już prawidłową składnią. Zostało zmienione na[[Int]]()
.Odpowiedzi:
Zdefiniuj zmienną tablicę
LUB:
LUB jeśli potrzebujesz tablicy o predefiniowanym rozmiarze (jak wspomniano w komentarzach @ 0x7fffffff):
Zmień element na pozycji
LUB
Zmień macierz podrzędną
LUB
LUB
Gdybyś miał tablicę 3x2 0 (zer) przed tymi zmianami, teraz masz:
Należy więc pamiętać, że tablice podrzędne są zmienne i można przedefiniować początkową tablicę reprezentującą macierz.
Sprawdź rozmiar / granice przed dostępem
Uwagi: Te same reguły znaczników dla tablic 3 i N wymiarowych.
źródło
arr
zdefiniowałeś tak jak w odpowiedzi, tomyVar
powinno być Int, prawda?var arr = Int(repeating: Int(repeating: 0, count: 2), count: 3)
var arr = Array(count: 2, repeatedValue: Array(count: 3, repeatedValue: 0))
Z dokumentów:
Możesz tworzyć tablice wielowymiarowe, zagnieżdżając pary nawiasów kwadratowych, w których nazwa podstawowego typu elementów jest zawarta w najbardziej wewnętrznej parze nawiasów kwadratowych. Na przykład możesz utworzyć trójwymiarową tablicę liczb całkowitych, używając trzech zestawów nawiasów kwadratowych:
Podczas uzyskiwania dostępu do elementów w tablicy wielowymiarowej, skrajny lewy indeks indeksu dolnego odnosi się do elementu w tym indeksie w najbardziej zewnętrznej tablicy. Następny indeks dolny po prawej stronie odnosi się do elementu w tym indeksie tablicy, który jest zagnieżdżony na jednym poziomie. I tak dalej. Oznacza to, że w powyższym przykładzie tablica3D [0] odnosi się do [[1, 2], [3, 4]], tablica3D [0] [1] odnosi się do [3, 4], a tablica3D [0] [1 ] [1] odnosi się do wartości 4.
źródło
Niech to będzie Generic Swift 4
źródło
Należy zachować ostrożność podczas używania
Array(repeating: Array(repeating: {value}, count: 80), count: 24)
.Jeśli wartością jest obiekt, który jest inicjowany przez
MyClass()
, wtedy użyją tego samego odwołania.Array(repeating: Array(repeating: MyClass(), count: 80), count: 24)
nie tworzy nowej instancjiMyClass
w każdym elemencie tablicy. Ta metoda tworzy tylkoMyClass
raz i umieszcza ją w tablicy.Oto bezpieczny sposób na zainicjowanie tablicy wielowymiarowej.
źródło
Array(repeating: {value}, could 80)
w nawiasach klamrowych{value}
? To stworzyłoby szereg zamknięć, prawda?{value}
meta-notacja dla „jakiejś wartości typu AnyObject” (typ referencyjny)?W Swift 4
źródło
Zgodnie z dokumentami Apple dla Swift 4.1 możesz tak łatwo użyć tej struktury do utworzenia tablicy 2D:
Link: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html
Przykład kodu:
źródło
Array(repeating:count:)
. Zobacz komentarz, który zamieściłem do Twojej drugiej odpowiedzi.Przed użyciem tablic wielowymiarowych w Swift należy rozważyć ich wpływ na wydajność . W moich testach spłaszczona tablica wypadła prawie 2x lepiej niż wersja 2D:
Średni czas wykonywania zapełnienia tablicy 50x50: 82,9 ms
vs.
Średni czas wykonywania wypełnienia tablicy 2D 50x50: 135 ms
Oba algorytmy mają wartość O (n ^ 2), więc różnica w czasie wykonywania jest spowodowana sposobem, w jaki inicjalizujemy tabelę.
Wreszcie, najgorsze, co możesz zrobić, to
append()
dodać nowe elementy. To okazało się najwolniejsze w moich testach:Średni czas wykonywania wypełniania tablicy 50x50 za pomocą funkcji append (): 2,59 s
Wniosek
Unikaj tablic wielowymiarowych i korzystaj z dostępu według indeksu, jeśli liczy się szybkość wykonywania. Tablice 1D są bardziej wydajne, ale Twój kod może być nieco trudniejszy do zrozumienia.
Możesz samodzielnie przeprowadzić testy wydajności po pobraniu projektu demonstracyjnego z mojego repozytorium GitHub: https://github.com/nyisztor/swift-algorithms/tree/master/big-o-src/Big-O.playground
źródło
Można to zrobić w jednej prostej linii.
Szybki 5
Możesz również zmapować go na wystąpienia dowolnej wybranej klasy lub struktury
źródło