[Swift]數組(Array)最強解析


★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公眾號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/ 
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10297316.html 
➤如果鏈接不是山青詠芝的博客園地址,則可能是爬取作者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持作者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

一、聲明數組

1.1 初始化空數組

1 var arr1 = []
2 var arr2 = Array<Int>()
3 var arr3 = [Int]()

1.2 初始化具有默認值的數組

1 var arr4 = [1,2,3,4,5]
2 var arr5 = Array<Int>(repeating: 0, count: 5)
3 var arr6 = [Int](repeating: 0, count: 5)

二、數組基本操作 

var arr = [1,2,3,4,5]

2.1 添加元素

1 //方法1:添加元素到末尾
2 arr.append(1)
3 //方法2:數組相加,數組類型必須一致
4 arr += [6,7,8,9]
5 arr = arr + [6,7,8,9]

2.2 插入元素

1 //在索引1(第二個位置)插入元素6
2 arr.insert(6,at:1)

2.3 刪除元素

  • removeFirst、removeLast(),需要代碼邏輯判斷確保數組中非空,否則會引發運行時錯誤。
  • popLast(),如果數組為空,則返回nil。注意無popFirst()方法。
 1 //刪除第一個元素
 2 arr.removeFirst()
 3 
 4 //刪除最后一個元素
 5 //保證數組非空
 6 arr.removeLast()
 7 //空數組時返回nil
 8 arr.popLast()
 9 
10 //根據元素索引刪除元素
11 arr.remove(at: 1)
12 
13 //刪除數組區間的元素
14 arr.removeSubrange(Range.init(NSMakeRange(1, 2))!)
15 
16 //刪除所有元素
17 arr.removeAll()

2.4 修改元素

1 //修改指定索引元素
2 arr[0] = 6
3 //修改數組區間的元素
4 arr[1...3] = [1,2,3]

三、數組基本方法 

var arr = [1,2,3,4,5]

3.1 判空

arr.isEmpty

3.2 數組長度

arr.count

3.3 獲取元素

1 //根據索引i:
2 arr[i]
3 //獲取第一個元素:
4 arr.first 
5 arr[0]
6 //獲取最后一個元素:
7 arr.last 
8 arr[arr.count-1]

3.4 數組最值

1 //數組最小值
2 arr.min()
3 //數組最大值
4 arr.max()

3.5 數組區間

arr[0...1]

3.6 判斷包含指定元素

arr.contains(5)

3.7 返回指定元素索引

1 //返回值為可選型Optional Type(可選類型)
2 arr.index(of: 5)
3 //Optional(4)

3.8 遍歷數組

 1 //方法一:遍歷索引
 2 for index in 0..<arr.count{
 3     arr[index]
 4 }
 5 
 6 //through:包含最后一個元素
 7 //to:不包含最后一個元素
 8 for i in stride(from:0,through:4,by:1)
 9 {
10     print(arr[i])
11 }
12 
13 //方法二:遍歷元素
14 for number in arr{
15     print(number)
16 }
17 
18 //方法三:同時遍歷索引和元素
19 for (index, number) in arr.enumerated(){
20     //遍歷數組索引和元素
21     print("\(index+1): \(vowel)")
22 }
23 
24 //方法四:forEach遍歷
25 arr.forEach
26 {
27     (element) in
28     print(element)
29 }

請點擊鏈接:[Swift]forEach詳解

3.9 startIndex、endIndex

startIndex:數組第一個元素的索引。

endIndex:數組最后一個元素的索引的下一位。 

 1 var arr = [1,2,3,4,5]
 2 
 3 //startIndex是數組第一個元素的索引
 4 print(arr[arr.startIndex])
 5 //Print 1
 6 
 7 print(arr[arr.startIndex..<arr.endIndex])
 8 //Print [1, 2, 3, 4, 5]
 9 
10 //注意endIndex不是數組最后一個元素的索引
11 print(arr[..<arr.endIndex])
12 //Print [1, 2, 3, 4, 5]

 四、數組特殊方法 

4.1 filter

(1)直接過濾數組元素,返回滿足符合條件的新數組。 

1 var arr = [1,2,3,4,5]
2 //$0表示arr中的元素
3 //返回大於2的元素組成的數組
4 let filterArr = arr.filter { $0 > 2 }

 (2)傳入一個閉包函數作為參數,作為判斷條件,返回滿足符合條件的新數組。 

1 var arr = ["123Z","456Z","789"]
2 let filterArr = arr.filter { (str) -> Bool in
3            return str.contains("Z")}
4 print(filterArr)
5 //Print ["123Z", "456Z"]

4.2 map

將原來數組中的元素映射到新的數組中,映射數組元素,轉化元素類型。
map函數以一個閉包函數作為參數,返回一個新的數組,編譯器會自動根據調用它的數組類型自動推斷出返回數組的類型。

 1 var arr = [1,2,3,4,5]
 2 //映射成字符串類型
 3 let mapArr1 = arr.map { (num) -> String in
 4     return "\(num)" + "Z"
 5 }
 6 print(mapArr1)
 7 //Print ["1Z", "2Z", "3Z", "4Z", "5Z"]
 8 
 9 
10 //將數組中每個元素的值乘以3
11 let mapArr2 = (1...5).map{$0*3}
12 print(mapArr2)
13 //Print [3, 6, 9, 12, 15]

4.3 flatMap

flatMap方法是在map方法的基礎上增加新的功能。

(1) 空值過濾:調用flatMap生成的新數組過濾掉了nil值的元素,得到的新數組里面全部都是非nil得元素。

String類型

1 let arr = ["1", "2", "3", "4", nil]
2 let newArr = arr.flatMap { $0 }
3 print(newArr)
4 //Print ["1", "2", "3", "4"]

Int類型

1 let arr = [1, 2, 3, 4, nil]
2 let newArr = arr.flatMap { $0 }
3 print(newArr)
4 //Print [1, 2, 3, 4]

(2) 強解包:flatMap自動幫我們做了解包的工作,不用去解包元素。以map方法進行對比。

 1 //以map方法進行對比
 2 let arr1:[String?] = ["123", "456", "789"]
 3 let newArr1 = arr1.map { $0 }
 4 print(newArr1)
 5 //Print [Optional("123"), Optional("456"), Optional("789")]
 6 
 7 //flatMap
 8 let arr2:[String?] = ["123", "456", "789"]
 9 let newArr2 = arr2.flatMap { $0 }
10 print(newArr2)
11 //Print ["123", "456", "789"]

(3) 數組壓平解嵌套數組:指是把一個二維數組里面的元素(數組)展開成一維數組。

檢查數組中有沒有嵌套數組,把嵌套的數據結構再重組成一個數組。

1 var arr = [[1], [2], [3], [4], [5]]
2 let flatMapArr = arr.flatMap{ $0 }
3 //壓平解嵌套數組
4 print(flatMapArr)
5 // Print [1, 2, 3, 4, 5]

請點擊鏈接:[Swift]多維數組的表示和存儲:N維數組映射到一維數組(一一對應)!

4.4 compactMap

過濾數組中出現的nil和可選類型。 

可以把一個集合中的空值去除,並且返回一個去除nil值得數組

 1 let numbers = [1, 2,nil, 5]
 2 
 3 //compactMap
 4 let compactMapResult = numbers.compactMap { (number) -> Int? in
 5     return number
 6 }
 7 print(compactMapResult)
 8 //Print [1, 2, 5]
 9 
10 //map
11 let mapResult = numbers.map { (number) -> Int? in
12     return number
13 }
14 print(mapResult)
15 //Print [Optional(1), Optional(2), nil, Optional(5)]

 4.5 reduce

可以把數組變成一個元素,首先需要指定一個初始值,然后在閉包中寫一個reduce的規則,接着reduce方法會開始遞歸的對數組中的元素進行閉包運算,直到算出最后一個結果。

注意還可以用於其他符號,不只是四則運算符。

 1 //第一個參數為用來運算的初始值。
 2 //依次用第二個參數的運算符號與數組元素進行算術運算。
 3 
 4 //數組所有元素之和
 5 print((1...5).reduce(0, +))
 6 //Print 15
 7 
 8 //數組所有元素之差
 9 print((1...5).reduce(0, -))
10 //Print -15
11 
12 //數組所有元素之積
13 print((1...5).reduce(1, *))
14 //Print 120
15 
16 //數組所有元素之商
17 print((1...5).reduce(120, /))
18 //Print 1
19 
20 //數組所有元素異或:相同為0,不同為1
21 print([1,1].reduce(0, ^))
22 //Print 0
23 print([1,1,1].reduce(0, ^))
24 //Print 1

將數組元素連接成字符串並添加指定內容,閉包和簡寫形式:

 1 var arr = [1,2,3,4,5]
 2 //閉包形式
 3 let newArr1 = arr.reduce("strengthen") { (a1, a2) -> String in
 4           return "\(a1)" + "\(a2)"}
 5 print(newArr1)
 6 //Print strengthen12345
 7 
 8 //簡寫形式
 9 let newArr2 = arr.reduce("Z"){ "\($0)" + "\($1)" }
10 print(newArr2)
11 //Print Z12345

4.6 prefix、suffix

獲取數組從頭或從尾開始的一段片段。

 1 var arr = [1,2,3,4,5]
 2 //prefix:從頭部開始截取
 3 //upTo:[0,3),不包含第三個元素的索引:0,1,2
 4 let prefixArr = arr.prefix(upTo: 3)
 5 print(prefixArr)
 6 //Print [1, 2, 3]
 7 
 8 //suffix:截取至尾部
 9 //從第三個元素到末尾,包含第三個元素的索引:3,4
10 let suffixArr = arr.suffix(from: 3)
11 print(suffixArr)
12 //Print [4, 5]

4.7 dropFirst()、dropLast()

 與prefix、suffix互補的方法,獲得刪除從頭部或尾部開始的區間元素后的數組。

 1 var arr = [1,2,3,4,5]
 2 //從頭部開始刪除三個元素
 3 let dropFirstArr = arr.dropFirst(3)
 4 print(dropFirstArr)
 5 //Print [4, 5]
 6 
 7 //從尾部開始刪除三個元素
 8 let dropLastArr = arr.dropLast(3)
 9 print(dropLastArr)
10 //Print [1, 2]

4.8 驗證字符串中是否包含某個單詞

 1 let words = ["Strengthen","Swift","iOS"]
 2 let sentence = "My name is Strengthen"
 3 
 4 //方法1:filter
 5 let result1 = !words.filter({sentence.contains($0)}).isEmpty
 6 print(result1)
 7 //Print true
 8 
 9 //方法2:contains
10 let result2 = words.contains(where: sentence.contains)
11 print(result2)
12 //Print true
13         
14 //方法3:拆分
15 let result3 = sentence.characters
16         .split(separator: " ")
17         .lazy
18         .map(String.init)
19         .contains(where: Set(words).contains)
20 print(result3)
21 //Print true

 4.9 埃拉托色尼選篩法(求小於N的所有質數)

1 let number = 100
2 var primes = Set(2...number)
3 (2...Int(sqrt(Double(number)))).forEach {
4    let _ = primes.subtract(stride(from: 2*$0, through: number, by: $0))
5 }
6 print(primes.sorted())
7 //Print [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

4.10 elementsEqual

比較數組相等或以特定元素開始。對這類操作,需要提供兩個內容,一個是要比較的數組,另一個則是比較的規則

 1 var arr = [1,2,3]
 2 //比較另一個數組的各元素是否時原數組各元素的兩倍
 3 let result1 = arr.elementsEqual([2,4,6], by: { $0*2 == $1 })
 4 print(result1)
 5 //Print true
 6 
 7 //比較從頭部開始的元素區間是否相同
 8 let result2 = arr.starts(with: [1,2], by: { $0 == $1 })
 9 print(result2)
10 //Print true

 4.11 partition

partition(by:)則會先對傳遞給它的數組進行重排,然后根據指定的條件在重排的結果中返回一個分界點位置。

這個分界點分開的兩部分中:前半部分的元素都不滿足指定條件;后半部分都滿足指定條件。

這樣就可以使用range operator來訪問者兩個區間形成的 Array對象。
 1 var arr = [1,2,3,4,5]
 2 
 3 //條件:大於3
 4 let privot1 = arr.partition(by: { $0 > 3 })
 5 print(privot1)
 6 //Print 3
 7 
 8 //前半部分是不符合條件的元素
 9 print(arr[0..<privot1]) 
10 //Print [1, 2, 3]
11 
12 //后半部分是符合條件的元素
13 print(arr[privot1..<arr.endIndex])
14 //Print [4, 5]
15 
16 
17 //條件:小於3
18 let privot2 = arr.partition(by: { $0 < 3 })
19 print(privot2)
20 //Print 3
21 
22 //前半部分是不符合的元素
23 print(arr[0..<privot2]) 
24 //Print [5, 4, 3]
25 
26 //后半部分是符合條件的元素
27 print(arr[privot2..<arr.endIndex])
28 //Print [[2, 1]

4.12 contains

contains的一個好處就是只要遇到滿足條件的元素,函數的執行就終止了。

基於這個contains,還可以給Array添加一個新的方法,用來判斷Array中所有的元素是否滿足特定的條件。

1 var arr = [1,2,3,4,5]
2 //判斷是否包含偶數
3 let result = arr.contains{ $0 % 2 == 0}
4 print(result)
5 //Print true

4.13 交換數組中元素的值

請點擊鏈接:[Swift]Array數組的swapAt函數

4.14 forEach:

請點擊鏈接:[Swift]forEach詳解

注意,在forEach閉包中,return不會中斷整個遍歷。

4.15 sorted:排序

請點擊鏈接:[Swift]數組排序:sort和sorted 

4.16.字符串直接轉換成字符數組或字符串數組

 1 let str:String = "strengthen"
 2 //方法1:轉換為字符數組
 3 var arr1:[Character] = Array(str)
 4 print(arr1)
 5 //Print ["s", "t", "r", "e", "n", "g", "t", "h", "e", "n"]
 6 
 7 //方法2:轉換為字符串數組
 8 var arr2:[String] = str.map{ String($0) }
 9 print(arr2)
10 //Print ["s", "t", "r", "e", "n", "g", "t", "h", "e", "n"]

五、NSArray與Array

(1)Array是一個結構體,是值類型。

在Swift中,Array是按照值語義實現的,當我們復制一個Array對象時,會拷貝整個Array的內容。

(2)NSArray是一個類,是引用類型。

在Foundation中,數組這個類型有兩點和Swift的Array是不同的:

  • 數組是否可以被修改時通過NSArray和NSMutableArray這兩個類型來決定的
  • NSArrayNSMutableArray都是類對象,復制他們執行的是引用語義 
var arr: [NSObject] = [1 as NSObject,"swift" as NSObject]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM