我在排序对象数组时遇到问题,这些对象是不同的,每个对象都有自己不同的objectId,但是某些对象的内容是相同的,这里我的print(Myarray)的输出是:对象数组输入notificationManager
[notificationManager, notificationManager, notificationManager,
notificationManager, notificationManager, notificationManager,
notificationManager, notificationManager, notificationManager]
但是,我想对它们进行分组,因为在notificationManager中,我具有诸如fromWho和forWho和Activity之类的属性,因此对于某些用户,它们具有相同的fromWho属性,对于相同的用户forWho和相同的活动,它们意味着重新组合,因此从逻辑上讲,我将需要另一个数组来添加像这样的唯一值,并跟踪每个元素出现了多少次
myArray[i].fromWho
因为对数组进行排序本身不会有任何区别,因为从外观上看数组已经包含了不同的元素,这是对象的内容不同,这是我的代码,但是肯定需要很多修改
private static func removeDuplicates( origArray: [notificationManager]) -> [notificationManager?] {
//initialize an empty array with the same count as the original array
var completionsToSend = [notificationManager?](repeating: nil, count: origArray.count)
var j = 0
for i in 0...origArray.count - 1 {
let currentElemnt = origArray[i]
if i < origArray.count - 1 {
if (currentElemnt.fromwho.username != origArray[i+1].fromwho.username && currentElemnt.forwho.username != origArray[i+1].forwho.username && currentElemnt.activity != origArray[i+1].activity) {
j += 1
completionsToSend[j] = currentElemnt;
}
}
}
if j < origArray.count - 1 {
j += 1
completionsToSend[j] = origArray[origArray.count - 1]
}
return completionsToSend
}
后来我只调用了该函数:
let myArray = removeDuplicates(origArray: completions)
这也是我的notificationManager对象
class notificationManager: Hashable {
//MARK: Properties
var fromwho : PFUser!
var forwho : PFUser!
var type : Int!
var activity: ActivityModel!
var status : Int!
var date : Date!
var transaction : paymentModel!
var participant : participantModel!
var hashValue: Int {
return status.hashValue
}
init(fromwho: PFUser, forwho: PFUser, type: Int, activity: ActivityModel, status: Int, date: Date, transaction: paymentModel, participant: participantModel) {
self.fromwho = fromwho
self.forwho = forwho
self.type = type
self.activity = activity
self.status = status
self.date = date
self.transaction = transaction
self.participant = participant
}
//MARK: Inits
init(object:participantModel) {
self.fromwho = object.participant
self.forwho = object.activitymaker
self.type = object.type
self.activity = object.activity
self.status = object.status
self.date = object.updatedAt
if object.transaction != nil{
self.transaction = object.transaction
}
self.participant = object
}
有人建议修改吗?谢谢
答案 0 :(得分:1)
好的,因此可以基于forWho
,fromWho
和activity
属性过滤没有重复项的新数组。
我创建了一个简单的模型来模拟您的问题,因为实现完全相同的情况有点困难,但是让我们深入研究一下。
struct Item { // as your Notification object
var id: Int
var name: String
var nick: String
var activity: Int
}
extension Item: Equatable {
static func == (lhs: Item, rhs: Item) -> Bool {
let name = lhs.name == rhs.name
let activity = lhs.activity == rhs.activity
let nick = lhs.nick == rhs.nick
return name && activity && nick
}
}
// sample array of objects
let items: [Item] = [
Item(id: 1, name: "foo", nick: "foo", activity: 0),
Item(id: 2, name: "foo", nick: "foo", activity: 0),
Item(id: 3, name: "bee", nick: "bee", activity: 1),
Item(id: 4, name: "boo", nick: "boo", activity: 2),
Item(id: 5, name: "bee", nick: "bee", activity: 1),
Item(id: 6, name: "cee", nick: "cee", activity: 3),
]
// filtration.
var newItems: [Item] = []
for item in items {
if !newItems.contains(item){
newItems.append(item)
} else {
print("alreadyExisted")
}
}
如您所见,我们只是在确认Equatable
协议,该协议使我们能够在==
运算符之间比较自定义对象或几乎所有内容。
上方,您可以看到我使用它基于每个Bool
上的name
,nick
,activity
返回它的lhs
值, rhs
彼此相等。
,因此我可以简单地问我的array
是否在上面的item
部分中包含filtration
,因为它会根据这些属性检查该项目是否已经存在。
现在
对于您的情况,请确保确认上述Equatable
协议并执行检查。
由于您的基础属性不是简单的Strings
或Ints
因此,您可能也必须向这些模型确认Equatable
,这应该使您大致了解其工作方式。
在Playground上测试代码,
输出
已经存在2个项目,
新数组[Item(id:1,名称:“ foo”,昵称:“ foo”,活动:0),
Item(id:3,name:“ bee”,nick:“ bee”,activity:1),
Item(id:4,名称:“ boo”,昵称:“ boo”,活动:2),
项目(id:6,名称:“ cee”,昵称:“ cee”,活动:3)]