2016-04-28 59 views
0

我有以下的数组:识别和计数阵列复制

var newOrderItems = [Order]() 

保持订单类型元素:

let order = Order(item: itemName, quantity: 1) 
newOrderItems.append(order!) 

在一些点newOrderItems成立:

[ 
Order("item1", 1), 
Order("item1", 1), 
Order("item2", 1), 
Order("item2", 1), 
Order("item3", 1), 
Order("item1", 1) 
] 

我需要识别并计数重复的Order数组元素,以便形成一个字符串消息,如:

“您已订购3 x item1,2 x item2,1 x item3”。

有没有简单的方法呢?我的解决方案要么增加开销太多(即嵌套循环),要么增加太多的复杂性(即独特的NSCountedSet),因为我认为这些都是微不足道的。

+0

你应该使用字典而不是数组 –

回答

2

我会做一个迅速dictionary管理样订货:

var newOrderItems = [Order: Int]() 

if let order = Order(item: itemName, quantity: 1) { 
      if newOrderItems[order] == nil { 
       newOrderItems[order] = 1 
      } else { 
       newOrderItems[order]+=1 
      } 
} 

并且可以打印等的细节:

var str = "You have ordered " 
for order in newOrderItems.keys { 
    str += "\(newOrderItems[order]) x \(order.item)," 
} 
print(str) 

希望这将帮助!

+0

这将需要订单符合协议哈希 –

0

当您最初将对象附加到数组时,为什么不在那里增加计数器,而不是在之后执行,以节省时间?

+0

我需要多个计数器,因为不同类型的订单项可以无限增加/减少(理论上)。 – Polis

0

怎么样:

var str = "You have ordered " 

for object in newOrderItems { 
    let itemInstancesFound = newOrderItems!.filter({ $0["item"] as! String == object["item"] as! String }).count 

    str += "\(itemInstancesFound) x \(object["item"] as! String)," 
} 

这个假设数量始终为1(在我最初有Q显示)。