Ios 问题排序对象数组,不同对象但内容相同
我对一个对象数组进行排序时遇到了一个问题,这些对象是不同的,每个对象都有自己不同的objectId,但是有些对象的内容是相同的,这里是我的打印输出(Myarray):对象类型notificationManager的数组Ios 问题排序对象数组,不同对象但内容相同,ios,arrays,swift,sorting,Ios,Arrays,Swift,Sorting,我对一个对象数组进行排序时遇到了一个问题,这些对象是不同的,每个对象都有自己不同的objectId,但是有些对象的内容是相同的,这里是我的打印输出(Myarray):对象类型notificationManager的数组 [notificationManager, notificationManager, notificationManager, notificationManager, notificationManager, notificationManager,
[notificationManager, notificationManager, notificationManager,
notificationManager, notificationManager, notificationManager,
notificationManager, notificationManager, notificationManager]
然而,我想对它们进行分组,因为在notificationManager中,我有一些属性,例如fromWho和forWho以及Activity,所以有一些notificationManager,它们有相同的属性fromWho,对于同一用户forWho和同一Activity,从逻辑上讲,它们是要重新组合的,我需要另一个数组来添加这样的唯一值,并跟踪每个元素出现的次数
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
}
这也是我的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
}
有人能提出修改意见吗?谢谢好的,根据who的
属性、who
和活动的过滤一个没有重复项的新数组
我创建了一个简单的模型来模拟您的问题,因为实现完全相同的情况有点困难,但是让我们深入研究一下
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")
}
}
正如您所看到的,我们只是确认了equalable
协议,该协议允许我们在=
操作符之间比较自定义对象或几乎任何东西
上面您可以看到,我使用它返回它的Bool
值,基于名称
,尼克
,活动
在每个lhs
,rhs
上是否彼此相等
这样,我就可以简单地在上面的filtering
部分询问我的array
是否包含item
,因为它会根据这些属性检查该项是否已经存在
现在
对于您的情况,请确保按照上述equalable
协议进行确认并执行检查
因为您基于的属性不是简单的字符串
或整数
因此,您可能还需要确认这些模型的equalable
,这将为您提供一个如何实现的大图
在操场上测试代码
输出
已经存在2项
新数组[项目(id:1,名称:“foo”,尼克:“foo”,活动:0)
项目(id:3,名称:“蜜蜂”,尼克:“蜜蜂”,活动:1)
项目(id:4,名称:“boo”,尼克:“boo”,活动:2)
项目(编号:6,名称:“cee”,尼克:“cee”,活动:3)]
你能展示一下你的NotificationManager对象吗?是的,我确实修改了Post。它使用的唯一id是什么?实际上,我没有为每个forWho和fromWho元素的objectarray使用唯一id?它起作用了,我只是改变了一件事,我只比较了fromWho和forWho,它似乎也不比较活动,所以我不得不将其从公平扩展中删除
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")
}
}