2016-04-28 35 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顯示)。