如何对二维数组的第一个维度进行排序 Swift
How to Sort the first dimension of a 2D Array Swift
我正在尝试对 CSV 文件的列进行排序,CSV 的内容在字符串中提供
Beth,Charles,Danielle,Adam,Eric\n
17945,10091,10088,3907,10132\n
2,12,13,48,11
将字符串转换为二维数组
[["Beth", "Charles", "Danielle", "Adam", "Eric"], ["17945", "10091", "10088", "3907",
"10132"], ["2", "12", "13", "48", "11"]]
我怎样才能只对二维数组的第一维或二维数组中的名称进行排序,同时仍然保留另一个维度的映射,我不知道如何正确解释这个,但我希望下面的详细信息将帮助您了解我想要实现的目标。
Adam,Beth,Charles,Danielle,Eric\n
3907,17945,10091,10088,10132\n
48,2,12,13,11
我想通过对名称进行排序并将其他数组中的其他值映射到如下所示的名称来实现此目的,
[["Adam", "Beth", "Charles", "Danielle", "Eric"], ["3907", "17945", "10091", "10088",
"10132"], ["48", "2", "12", "13", "11"]]
使用此方法无效,但会对整个数组进行排序
let sortedArray = 2dArray.sorted(by: {([=15=][0] as! String) < ([0] as! String) })
[["3907", "17945", "10091", "10088", "10132"], ["48", "2", "12", "13", "11"], ["Adam", "Beth", "Charles", "Danielle", "Eric"]]
下面是完整代码
var stringCSV =
"Beth,Charles,Danielle,Adam,Eric\n17945
,10091,10088,3907,10132\n2,12,13,48,11";
var csvFormatted = [[String]]()
stringCSV.enumerateLines { line , _ in
var res = line.split(separator: ",",omittingEmptySubsequences:
false).map{ String([=16=]) }
for i in 0 ..< res.count {
res[i] = res[i]
}
csvFormatted.append(res)
}
print(csvFormatted)
let sortedArray = csvFormatted.sorted(by: {([=16=][0] as! String)
< ([0] as! String) })
print(sortedArray)
使用“关联”数组总是以混乱告终。
我首先创建一个结构来表示每个对象(您没有说数字是什么,所以我选择了几个 属性 名称。我还保留了 String
作为它们的类型,但转换为 Int
可能更好,具体取决于数据实际表示的内容)。
struct Person {
let name: String
let id: String
let age: String
}
现在您可以组合数组并使用它来构建这些结构的数组。然后你可以按 name
属性.
排序
let properties = zip(sourceArray[1],sourceArray[2])
let namesAndProperties = zip(sourceArray[0],properties)
let structArray = namesAndProperties.map { (name,properties) in
return Person(name: name, id: properties.0, age: properties.1)
}
let sortedArray = structArray.sorted {
return [=11=].name < .name
}
我正在尝试对 CSV 文件的列进行排序,CSV 的内容在字符串中提供
Beth,Charles,Danielle,Adam,Eric\n
17945,10091,10088,3907,10132\n
2,12,13,48,11
将字符串转换为二维数组
[["Beth", "Charles", "Danielle", "Adam", "Eric"], ["17945", "10091", "10088", "3907",
"10132"], ["2", "12", "13", "48", "11"]]
我怎样才能只对二维数组的第一维或二维数组中的名称进行排序,同时仍然保留另一个维度的映射,我不知道如何正确解释这个,但我希望下面的详细信息将帮助您了解我想要实现的目标。
Adam,Beth,Charles,Danielle,Eric\n
3907,17945,10091,10088,10132\n
48,2,12,13,11
我想通过对名称进行排序并将其他数组中的其他值映射到如下所示的名称来实现此目的,
[["Adam", "Beth", "Charles", "Danielle", "Eric"], ["3907", "17945", "10091", "10088",
"10132"], ["48", "2", "12", "13", "11"]]
使用此方法无效,但会对整个数组进行排序
let sortedArray = 2dArray.sorted(by: {([=15=][0] as! String) < ([0] as! String) })
[["3907", "17945", "10091", "10088", "10132"], ["48", "2", "12", "13", "11"], ["Adam", "Beth", "Charles", "Danielle", "Eric"]]
下面是完整代码
var stringCSV =
"Beth,Charles,Danielle,Adam,Eric\n17945
,10091,10088,3907,10132\n2,12,13,48,11";
var csvFormatted = [[String]]()
stringCSV.enumerateLines { line , _ in
var res = line.split(separator: ",",omittingEmptySubsequences:
false).map{ String([=16=]) }
for i in 0 ..< res.count {
res[i] = res[i]
}
csvFormatted.append(res)
}
print(csvFormatted)
let sortedArray = csvFormatted.sorted(by: {([=16=][0] as! String)
< ([0] as! String) })
print(sortedArray)
使用“关联”数组总是以混乱告终。
我首先创建一个结构来表示每个对象(您没有说数字是什么,所以我选择了几个 属性 名称。我还保留了 String
作为它们的类型,但转换为 Int
可能更好,具体取决于数据实际表示的内容)。
struct Person {
let name: String
let id: String
let age: String
}
现在您可以组合数组并使用它来构建这些结构的数组。然后你可以按 name
属性.
let properties = zip(sourceArray[1],sourceArray[2])
let namesAndProperties = zip(sourceArray[0],properties)
let structArray = namesAndProperties.map { (name,properties) in
return Person(name: name, id: properties.0, age: properties.1)
}
let sortedArray = structArray.sorted {
return [=11=].name < .name
}