如何将 indexPath 数组拆分为单独的 indexPath 数组,每个数组的 indexPath 具有相同的 indexPath.section
How to split indexPath array into seperate array of indexPath, each array's indexPath has same indexPath.section
最近想根据indexPaths删除单元格,所以函数的入参是[IndexPath]
类型,需要根据indexPath.section
把[IndexPath]拆分成几个数组,有什么简单的方法可以做到这一点?
例如
indexPaths =
[IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0)]
想将其转换为
indexPath1 =
[IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1)]
indexPath0 =
[IndexPath(row: 2, section: 0)]
// maybe get a [Array]
[indexPath0, indexPath1]
一个可能的解决方案是首先构建一个字典,其中键是节号,值是该节中 IndexPath
的数组。
let indexPaths = [
IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0),
]
let pathDict = Dictionary(grouping: indexPaths) { (path) in
return path.section
}
然后你可以将这个字典映射到路径数组的数组中。但首先按部分对这些数组进行排序。
let sectionPaths = pathDict.sorted { (arg0, arg1) -> Bool in
return arg0.key < arg1.key // sort by section
}.map { [=11=].value } // get just the arrays of IndexPath
print(sectionPaths)
输出:
[[[0, 2]], [[1, 0], [1, 1], [1, 2]]]
- 我们需要一个 HashMap,映射到键上。
- 我们需要对字典进行排序
- 我们需要提取字典的值并将它们附加到数组
- 我们需要return那个数组
var indexPaths = [IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0)
]
extension Array where Element == IndexPath {
func splitArray() -> Array<[IndexPath]> {
var tempDict = [String : [IndexPath]]()
for element in self {
let section = element.section
if tempDict[String(section)] != nil {
// some element append
if var array = tempDict[String(section)] {
array.append(element)
tempDict[String(section)] = array
}
} else {
tempDict[String(section)] = [element]
}
}
// dictionary mayn't have sorted, sort the dictionary
tempDict.sorted{ [=10=].key > .key }
var returnedArray = Array<[IndexPath]>()
for (key, value) in tempDict {
returnedArray.append(value)
}
return returnedArray
}
}
print(indexPaths.splitArray())
使用过滤器:
let indexPath0 = indexPaths.filter { [=10=].section == 0 }
let indexPath1 = indexPaths.filter { [=10=].section == 1 }
最近想根据indexPaths删除单元格,所以函数的入参是[IndexPath]
类型,需要根据indexPath.section
把[IndexPath]拆分成几个数组,有什么简单的方法可以做到这一点?
例如
indexPaths =
[IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0)]
想将其转换为
indexPath1 =
[IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1)]
indexPath0 =
[IndexPath(row: 2, section: 0)]
// maybe get a [Array]
[indexPath0, indexPath1]
一个可能的解决方案是首先构建一个字典,其中键是节号,值是该节中 IndexPath
的数组。
let indexPaths = [
IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0),
]
let pathDict = Dictionary(grouping: indexPaths) { (path) in
return path.section
}
然后你可以将这个字典映射到路径数组的数组中。但首先按部分对这些数组进行排序。
let sectionPaths = pathDict.sorted { (arg0, arg1) -> Bool in
return arg0.key < arg1.key // sort by section
}.map { [=11=].value } // get just the arrays of IndexPath
print(sectionPaths)
输出:
[[[0, 2]], [[1, 0], [1, 1], [1, 2]]]
- 我们需要一个 HashMap,映射到键上。
- 我们需要对字典进行排序
- 我们需要提取字典的值并将它们附加到数组
- 我们需要return那个数组
var indexPaths = [IndexPath(row: 0, section: 1),
IndexPath(row: 1, section: 1),
IndexPath(row: 2, section: 1),
IndexPath(row: 2, section: 0)
]
extension Array where Element == IndexPath {
func splitArray() -> Array<[IndexPath]> {
var tempDict = [String : [IndexPath]]()
for element in self {
let section = element.section
if tempDict[String(section)] != nil {
// some element append
if var array = tempDict[String(section)] {
array.append(element)
tempDict[String(section)] = array
}
} else {
tempDict[String(section)] = [element]
}
}
// dictionary mayn't have sorted, sort the dictionary
tempDict.sorted{ [=10=].key > .key }
var returnedArray = Array<[IndexPath]>()
for (key, value) in tempDict {
returnedArray.append(value)
}
return returnedArray
}
}
print(indexPaths.splitArray())
使用过滤器:
let indexPath0 = indexPaths.filter { [=10=].section == 0 }
let indexPath1 = indexPaths.filter { [=10=].section == 1 }