如何添加唯一值以区分 Swift 数组中的重复数据?
How to add a unique value to differentiate between duplicate data in a Swift array?
有人能为我指出正确的方向来解决这个问题吗?
我正在使用以下结构中的值创建 table 个单元格。单元格已创建,数据在创建时显示在单元格中,效果很好。
问题是一些单元格具有相同的名称,我从结构数据中为每个单元格分配了一个单独的 ID,但我需要用户知道在重复项中首先创建了哪个重复项。有点像子号。
例如:1:apple -1 , 2:pear -1, 3:apple -2
1(在所有单元格中的位置)- Apple(单元格的名称)- 1(基于有多少个单元格被命名为 apple 的值)
我创建的 func idName() 告诉我们一个名字出现了多少次,但我如何分解它以便数据像上面那样显示?
struct Data {
var id: Int
var name: String
var color: String
var time: TimeInterval
var sessionId: Int
var userId: Int
}
func idName () {
let idElement = elements //another variable is used to grab the Array
var counts: [String: Int] = [:]
var idValue: Int
for id in idElement {
counts[id.name] = (counts[id.name] ?? 0) + 1
for (key, value) in counts {
print("\(key) occurs \(value) time(s)")
}
}
}
"I need the user to know which one of the duplicates was created first."
如何在每个项目创建时为其添加日期?
var date: Date = Date()
所以你可以对它们进行排序...
myObjects = myObjects.sorted(by: {
[=11=].date.compare(.date) == .orderedDescending
})
另一种方法是添加一个UUID,这将为您提供一个唯一的标识符供参考:
var uuid: UUID = UUID()
var someObjectID = myObject.uuid.uuidString
更新:
创建元素(您的数据结构)时,您应该在添加一个相同名称的元素之前检查您的元素数组,如果存在一个相同名称的元素,那么您可以递增一个未存储为属性 结构。
您可以使用 map
和 Dictionary(_:uniquingKeysWith:)
。
到return映射元素数组(数据结构数组)。
let mappedElements = elements.map([=13=].name, 1)
然后,计算重复项并创建一个包含匹配项目数的字典。
let counts = Dictionary(mappedElements, uniquingKeysWith: +)
这将导致 ["apple": 3, "pear": 2, "peach": 1]
等
我刚刚在数据中添加了 nameCounter 属性,这将指示特定名称的出现。像这样-
struct Data1 {
var id: Int
var name: String
var nameCOunter: Int? = 1
init(id: Int, name: String) {
self.id = id
self.name = name
}
static func addTestData() ->[Data1] {
var arr = [Data1]()
let model = Data1(id: 1, name: "apple")
let model1 = Data1(id: 2, name: "peer")
let model2 = Data1(id: 3, name: "apple")
let model3 = Data1(id: 4, name: "orange")
let model4 = Data1(id: 5, name: "grape")
let model5 = Data1(id: 6, name: "peer")
let model6 = Data1(id: 7, name: "apple")
arr = [model,model1,model2,model3,model4,model5,model6]
return arr
}
}
func idName() {
let idElement = Data1.addTestData()
var countedElement = [Data1]()
var nameArr = [String]()
for var dataModel in idElement {
nameArr.append(dataModel.name)
let count = nameArr.filter{[=10=] == dataModel.name}.count
dataModel.nameCOunter = count
countedElement.append(dataModel)
}
print(countedElement)
}
有人能为我指出正确的方向来解决这个问题吗?
我正在使用以下结构中的值创建 table 个单元格。单元格已创建,数据在创建时显示在单元格中,效果很好。
问题是一些单元格具有相同的名称,我从结构数据中为每个单元格分配了一个单独的 ID,但我需要用户知道在重复项中首先创建了哪个重复项。有点像子号。
例如:1:apple -1 , 2:pear -1, 3:apple -2
1(在所有单元格中的位置)- Apple(单元格的名称)- 1(基于有多少个单元格被命名为 apple 的值)
我创建的 func idName() 告诉我们一个名字出现了多少次,但我如何分解它以便数据像上面那样显示?
struct Data {
var id: Int
var name: String
var color: String
var time: TimeInterval
var sessionId: Int
var userId: Int
}
func idName () {
let idElement = elements //another variable is used to grab the Array
var counts: [String: Int] = [:]
var idValue: Int
for id in idElement {
counts[id.name] = (counts[id.name] ?? 0) + 1
for (key, value) in counts {
print("\(key) occurs \(value) time(s)")
}
}
}
"I need the user to know which one of the duplicates was created first."
如何在每个项目创建时为其添加日期?
var date: Date = Date()
所以你可以对它们进行排序...
myObjects = myObjects.sorted(by: {
[=11=].date.compare(.date) == .orderedDescending
})
另一种方法是添加一个UUID,这将为您提供一个唯一的标识符供参考:
var uuid: UUID = UUID()
var someObjectID = myObject.uuid.uuidString
更新:
创建元素(您的数据结构)时,您应该在添加一个相同名称的元素之前检查您的元素数组,如果存在一个相同名称的元素,那么您可以递增一个未存储为属性 结构。
您可以使用 map
和 Dictionary(_:uniquingKeysWith:)
。
到return映射元素数组(数据结构数组)。
let mappedElements = elements.map([=13=].name, 1)
然后,计算重复项并创建一个包含匹配项目数的字典。
let counts = Dictionary(mappedElements, uniquingKeysWith: +)
这将导致 ["apple": 3, "pear": 2, "peach": 1]
等
我刚刚在数据中添加了 nameCounter 属性,这将指示特定名称的出现。像这样-
struct Data1 {
var id: Int
var name: String
var nameCOunter: Int? = 1
init(id: Int, name: String) {
self.id = id
self.name = name
}
static func addTestData() ->[Data1] {
var arr = [Data1]()
let model = Data1(id: 1, name: "apple")
let model1 = Data1(id: 2, name: "peer")
let model2 = Data1(id: 3, name: "apple")
let model3 = Data1(id: 4, name: "orange")
let model4 = Data1(id: 5, name: "grape")
let model5 = Data1(id: 6, name: "peer")
let model6 = Data1(id: 7, name: "apple")
arr = [model,model1,model2,model3,model4,model5,model6]
return arr
}
}
func idName() {
let idElement = Data1.addTestData()
var countedElement = [Data1]()
var nameArr = [String]()
for var dataModel in idElement {
nameArr.append(dataModel.name)
let count = nameArr.filter{[=10=] == dataModel.name}.count
dataModel.nameCOunter = count
countedElement.append(dataModel)
}
print(countedElement)
}