Swift中的 數(shù)組Array

數(shù)組的創(chuàng)建

  • 字面量創(chuàng)建
  1. 可以使用數(shù)組字面量來(lái)初始化一個(gè)數(shù)組,它是一種以數(shù)組集合來(lái)寫(xiě)一個(gè),或者多個(gè)值的簡(jiǎn)寫(xiě)方式,數(shù)組字面量寫(xiě)作一系列的值,用都好分隔,用方括號(hào)括起來(lái)
  2. 創(chuàng)建空數(shù)組的時(shí)候必須攜帶類(lèi)型信息
  3. 如果內(nèi)容已經(jīng)提供了類(lèi)型信息,你可以通過(guò)空數(shù)組字面量來(lái)創(chuàng)建一個(gè)空數(shù)組
var array = [1, 2, 3, 4]
array = []
let arr:[Int] = []
let arr2 = [Int]()
let arr3: Array<Int> = []
  • 初始化器
  1. 初始化器有兩種方式 1.類(lèi)型 2.Array<類(lèi)型>()
var myArray = [String]()
var myArray2 = Array<String>()

2.初始器參數(shù)

  • init(repeating repeatedValue: Element, count: Int)
  • init(arrayLiteral elements: Element...)
let fiveZs = Array(repeating: "Z", count: 5)
print(fiveZs)
let chars = Array("hello")
print(chars)
let numbers = Array(1...9)
print(numbers)
  • init<S>(_elements: S) where S : Sequence, Self.Element == S.Element
  • init(from decoder: Decoder) throws
let number = [Int](0...7)
print(number)
let persons = ["zhangsan": 27, "lisi": 28, "wangwu": 29]
let names = [String](persons.keys)
print(names)

數(shù)組的遍歷和索引(訪問(wèn)和操作數(shù)組)

  • 數(shù)組遍歷
  1. For-in
let numbers = [Int](1...7)
for index in numbers {
    print(index)
}

  1. forEach 方法
    • 無(wú)法使用 break 或 continue 跳出或者跳過(guò)循環(huán)
    • 使用 return 只能退出當(dāng)前一次循環(huán)的執(zhí)行體
let numbers = [Int](0...7)
numbers.forEach { (num) in
    if num == 3 {
        return
    }
    print(num * 10)
}

3.同時(shí)得到索引和值 enumerated()

let numbers = [Int](1...7)
for (index, num) in numbers.enumerated() { //拆包
    print("the index is \(index)")
    print(num * 10)
}

4.使用 Iterator 遍歷數(shù)組

let numbers = [Int](1...7)
var numIterator = numbers.makeIterator() //迭代器
while let num = numIterator.next() {
    print(num * 10)
}
  • 數(shù)組索引
  1. starIndex 返回第一個(gè)元素的位置,對(duì)于數(shù)組來(lái)說(shuō),永遠(yuǎn)都是0
  2. endIndex 返回最后一個(gè)元素索引 +1 的位置,對(duì)于數(shù)組來(lái)說(shuō),等同于 count
  3. 如果數(shù)組為空,startIndex 等于 endIndex
  4. indices 獲取數(shù)組的索引區(qū)間
let numbers = [Int](1...7)
for i in numbers.indices {
    print(numbers[i] * 10)
}

數(shù)組訪問(wèn)和操作(查找操作)

  • 判斷是否包含指定元素
  1. contains(_:) 判斷數(shù)組是否包含給定元素
  2. contains(where:) 判斷數(shù)組是否包含符合給定條件的元素
let numbers = [Int](5...10)
print(numbers.contains(5)) 
print(numbers.contains(where: { $0 > 9 }))
  • 判斷所有元素符合某個(gè)條件
  1. allSatisfy(_:) 判斷數(shù)組的每一個(gè)元素都符合給定的條件
let numbers = [Int](5...10) 
print(numbers.allSatisfy({ $0 > 7}))
print(numbers.allSatisfy({ $0 > 4}))
  • 查找元素
  1. first 返回?cái)?shù)組第一個(gè)元素 (Optional), 如果數(shù)組為空, 返回nil
  2. last 返回?cái)?shù)組最后一個(gè)元素 (Optional), 如果數(shù)組為空,返回nil
  3. first(where:) 返回?cái)?shù)組第一個(gè)符合給定條件的元素 (Optional)
  4. last(where:) 返回?cái)?shù)組最后一個(gè)符合給定條件的元素 (Optional)
let numbers = [Int](5...10)
print(numbers.first)
print(numbers.last)
print(numbers.first(where: { $0 > 7 }))
print(numbers.last(where: { $0 < 7 }))
  • 索引查找
  1. firstIndex(of:) 返回給定的元素在數(shù)組中出現(xiàn)的第一個(gè)位置 (Optional)
  2. lastIndex(of:) 返回給定的元素在數(shù)組中出現(xiàn)的最后一個(gè)位置 (Optional)
var array = [10, 20, 30, 40, 30, 20, 10]
print(array.firstIndex(of: 30))
print(array.lastIndex(of: 20))
  1. firstIndex(where:) 返回符合條件的第一個(gè)元素的位置 (Optional)
  2. lastIndex(where:) 返回符合條件的最后一個(gè)元素的位置 (Optional)
var array = [10, 20, 30, 40, 30, 20, 10]
print(array.firstIndex(where: { $0 > 25 }))
print(array.lastIndex(where: { $0 > 25 }))
  • 查找最大最小元素
  1. min() 返回?cái)?shù)組中最小的元素
  2. max() 返回?cái)?shù)組中最大的元素
  3. min(by:) 利用給定的方式比較元素,并返回?cái)?shù)組的最小元素
  4. max(by:) 利用給定的方式比較元素,并放回?cái)?shù)組的最大元素
var array = [7, 5, 30, 40, 32, 40, 5]
print(array.min())
print(array.max())

var errors = [(0, "worring"), (100, "error"), (200, "success")]
print(errors.min(by: { a, b in a.0 < b.0 }))
print(errors.max(by: { a, b in a.0 < b.0 }))

errors = [(0, "b"), (100, "a"), (200, "d")]
print(errors.min(by: { a, b in a.1 < b.1 }))

數(shù)組添加和刪除操作

  • 在末尾添加
  1. append(:) 在末尾添加一個(gè)元素
var numbers = [Int](2...7)
numbers.append(100)
print(numbers)
  1. append(contentsOf:)在末尾添加多個(gè)元素
var numbers = [Int](2...7)
numbers.append(contentsOf: 200...203)
print(numbers)
  • 在任意位置插入
  1. insert(_:at:) 在指定的位置插入元素
var numbers = [Int](2...7)
numbers.insert(-1, at: 1)
print(numbers)
  1. insert(contentsOf:at:) 在指定位置插入多個(gè)元素
var numbers = [Int](2...7)
numbers.insert(contentsOf: 100...105, at: 1)
print(numbers)

3.字符串也是 Collection, Element 是 Character 類(lèi)型

var chars: [Character] = ["a", "b", "c"]
chars.insert(contentsOf: "hello", at: 0)
print(chars)
  • 移除單個(gè)元素
  1. remove(at:) 移除并返回指定位置的一個(gè)元素
var numbers = [Int](2...7)
let removeNum = numbers.remove(at: 1)
print(removeNum)
print(numbers)
  1. removeFirst() 移除并返回?cái)?shù)組的第一個(gè)元素
var numbers = [Int](2...7)
let num = numbers.removeFirst() //不能為空數(shù)組
print(num)
print(numbers)
  1. removeLast() 移除并返回?cái)?shù)組的最后一個(gè)元素
var numbers = [Int](2...7)
let endNum = numbers.removeLast() //不能為空數(shù)組
print(endNum)
print(numbers)
  1. popFirst() 移除并返回?cái)?shù)組的第一個(gè)元素(optional), 數(shù)組為空返回nil
let popNum = numbers.popLast() //可為空數(shù)組
print(popNum)
print(numbers)
  • 移除多個(gè)元素
  1. removeFirst(:) 移除數(shù)組前面多個(gè)元素
var numbers = [Int](2...7)
numbers.removeFirst()
print(numbers)

numbers.removeFirst(2) //從開(kāi)始移除的個(gè)數(shù)
print(numbers)
  1. removeLast(:) 移除數(shù)組后面多個(gè)元素
var numbers = [Int](2...7)
numbers.removeLast()
print(numbers)

numbers.removeLast(2) //從末尾移除的個(gè)數(shù)
print(numbers)
  1. removeSubrange(:) 移除數(shù)組中給定范圍的元素
numbers.removeSubrange(1...3)
print(numbers)
  1. removeAll() 移除數(shù)組所有元素
numbers.removeAll()
print(numbers)
print(numbers.capacity)
  1. removeAll(keepingCapacity:) 移除數(shù)組所有元素,保留數(shù)組容量(如果移除之后重新添加,建議保留數(shù)組容量)
numbers.removeAll(keepingCapacity: true)
print(numbers)
print(numbers.capacity)

ArraySlice(數(shù)組切片)

  • 移除多個(gè)元素
  1. ArraySlice 是數(shù)組或者其他 ArraySlice 的一段連續(xù)切片,和原數(shù)組共享內(nèi)存。
  2. 當(dāng)要改變 ArraySlice 的時(shí)候,ArraySlice 會(huì) copy 出來(lái),形成單獨(dú)的內(nèi)存
  3. ArraySlice擁有和 Array 基本完全類(lèi)似的方法
  • 通過(guò) Drop 得到 ArraySlice
  1. dropFirst(:) 移除原數(shù)組前面指定個(gè)數(shù)的元素,得到一個(gè) ArraySlice
  2. dropLast(:) 移除原數(shù)組后面指定個(gè)數(shù)的元素,得到一個(gè) ArraySlice
  3. drop(:) 移除原數(shù)組符合指定條件的元素得到一個(gè) ArraySlice
let numbers = [1, 10, 21, 98, 32, 53, 67, 89]
print(numbers)
print(numbers.dropFirst())
print(numbers.dropFirst(3))
print(numbers.dropLast())
print(numbers.dropLast(3))
print(numbers.drop(while: { $0 < 50 }))
  • 通過(guò) prefix 得到 ArraySlice
  1. prefix() 獲取數(shù)組前面指定個(gè)數(shù)的元素組成的 ArraySlice
  2. prefix(upTo:) 獲取數(shù)組到指定位置 (不包含指定位置) 前面的元素組成的 ArraySlice
  3. prefix(through:) 獲取數(shù)組到指定位置 (包含指定位置) 前面的元素組成的 ArraySlice
  4. prefix(while:) 獲取數(shù)組前面符合條件的元素 (到第一個(gè)不符合條件的元素截止) 組成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers.prefix(4))
print(numbers.prefix(upTo: 4))
print(numbers.prefix(through: 4))
print(numbers.prefix(while: { $0 < 5 })) 
  • 通過(guò) suffix 得到 ArraySlice
  1. suffix() 獲取數(shù)組后面指定個(gè)數(shù)的元素組成的 ArraySlice
  2. suffix(from:) 獲取數(shù)組從指定位置到結(jié)尾 (包含指定位置) 的元素組成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers.suffix(3))
print(numbers.suffix(from: 5))
  • 通過(guò) Range 得到 ArraySlice
  1. 可以通過(guò)對(duì)數(shù)組下標(biāo)指定 Range 獲取 ArraySlice,可以使用閉區(qū)間、半開(kāi)半閉區(qū)間、單側(cè)區(qū)間、甚至可以只是用...來(lái)獲取整個(gè)數(shù)組組成的 ArraySlice
let numbers = [Int](1...9)
print(numbers)
print(numbers[3...5])
print(numbers[3..<5])
print(numbers[...2])
print(numbers[..<2])
print(numbers[6...])
print(numbers[...])
  • ArraySlice 轉(zhuǎn)為 Array
  1. ArraySlice 無(wú)法直接賦值給一個(gè) Array 的常量或變量,需要使用 Array(slice)
var numbers = [Int](1...9)
let slice = numbers[3...5]
numbers = Array(slice)
print(numbers)
  • ArraySlice 和原 Array 相互獨(dú)立
  1. ArraySlice 和原 Array 相互獨(dú)立的,他們添加刪除元素不會(huì)影響對(duì)方
var numbers = [Int](1...3)
var slice = numbers.dropLast()
numbers.append(4)
print(slice)
print(numbers)
slice.append(5)
print(slice)
print(numbers)

數(shù)組重排

  • 數(shù)組元素的隨機(jī)化
  1. shuffle() 在原數(shù)組上將數(shù)組元素打亂,只能作用在數(shù)組變量上
  2. shuffled() 返回原數(shù)組的隨機(jī)化數(shù)組, 可以作用在數(shù)組常量和變量上,并不改變?cè)瓟?shù)組
var numbers = [Int](0...9) //隨機(jī)播放
numbers.shuffle()
print(numbers)
let array = [Int](0...9)
var arr = array.shuffled()
print(arr)
print(array)
  • 數(shù)組的逆序
  1. reverse() 在原數(shù)組上將數(shù)組逆序,只能作用在數(shù)組變量上
  2. reversed() 返回原數(shù)組的逆序“集合表示”,可以作用在數(shù)組變量和常量上,該方法不會(huì)重新分配新內(nèi)存空間
var numbers = [Int](0...9)
numbers.reverse()
print(numbers)
let array = [Int](0...9)
var arr = array.reversed()
print(arr) //共享內(nèi)存
print(array)
for index in arr {
    print(index)
}
  • 數(shù)組的分組
  1. partition(by belongsInSecondPartition:(Element) throws -> Bool) 將數(shù)組以某個(gè)條件分組,數(shù)組前半部分都是不符合條件的元素,數(shù)組后半部分都是符合條件的元素
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
let index = numbers.partition { (element) -> Bool in
    element > 30
}
print(numbers)
let partition1 = numbers[..<index]
let partition2 = numbers[index...]
print(partition1)
print(partition2)
  • 數(shù)組的排序
  1. sort() 在原數(shù)組上將元素排序,只能組用于數(shù)組變量。
  2. sorted() 返回原數(shù)組的排序結(jié)果數(shù)組,可以作用在數(shù)組變量和常量上
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
numbers.sort()
print(numbers)

let array = [10, 20, 45, 30, 98, 101, 30, 4]
let arr = array.sorted()
print(arr)
print(array)
  • 交換數(shù)組兩個(gè)元素
  1. swapAt(::) 交換指定位置的兩個(gè)元素
var numbers = [10, 20, 45, 30, 98, 101, 30, 4]
numbers.swapAt(numbers.startIndex, numbers.endIndex - 1)
print(numbers)

數(shù)組拼接

  • 字符串?dāng)?shù)組拼接
  1. joined() 拼接字符串?dāng)?shù)組里的所有元素,為一個(gè)字符串
  2. joined(separator:) 以給定的分隔符,拼接字符串?dāng)?shù)組里的所有元素,為一個(gè)字符串
let array = ["hello", "world"]
print(array.joined())
print(array.joined(separator: ","))
  • 元素為 Sequence 數(shù)組的拼接
  1. joined() 拼接數(shù)組里的所有元素為一個(gè)更大的 Sequence
  2. joined(separator:) 以給定的分隔符,拼接數(shù)組里的所有元素為一個(gè)更大的 Sequence
let ranges = [0...3, 8...10, 15...17]
for range in ranges {
    print(range)
}
for index in ranges.joined() { //拼接獲取range 的每一個(gè)值
    print(index)
}

let nestedNumbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let joined = nestedNumbers.joined(separator: [-1, -2])
print(nestedNumbers)
print(Array(joined))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容