排序对象,不同对象但内容相同的数组

时间:2018-12-23 08:50:55

标签: ios arrays swift sorting

我在排序对象数组时遇到问题,这些对象是不同的,每个对象都有自己不同的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
}

有人建议修改吗?谢谢

1 个答案:

答案 0 :(得分:1)

好的,因此可以基于forWhofromWhoactivity属性过滤没有重复项的新数组。

我创建了一个简单的模型来模拟您的问题,因为实现完全相同的情况有点困难,但是让我们深入研究一下。

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上的namenickactivity返回它的lhs值, rhs彼此相等。

,因此我可以简单地问我的array是否在上面的item部分中包含filtration,因为它会根据这些属性检查该项目是否已经存在。

现在

对于您的情况,请确保确认上述Equatable协议并执行检查。

由于您的基础属性不是简单的StringsInts 因此,您可能也必须向这些模型确认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)]