【问题标题】:How can I manage array index?如何管理数组索引?
【发布时间】:2019-09-26 12:53:38
【问题描述】:

我关于数组的问题。我有数组:

var orderItemName = [String]()

["halimiz duman aman", "halimiz duman aman", "halimiz duman aman", "halimiz duman aman", "halimiz duman aman", "halimiz duman aman", "burada da urun var", "burada da urun var", "burada da urun var", "urunler burdadir", "urunler burdadir", "urunler burdadir", "urunler burdadir", "urunler burdadir"]

var orderItemPrice = [String]()

["14 ₺", "14 ₺", "14 ₺", "14 ₺", "14 ₺", "14 ₺", "425 ₺", "425 ₺", "425 ₺", "32 ₺", "32 ₺", "32 ₺", "32 ₺", "32 ₺"]

var arrays = [String: Int]() 

["halimiz duman aman": 6, "urunler burdadir": 5, "burada da urun var": 3]

var arraysPrice = [String: Int]()

["425 ₺": 3, "14 ₺": 6, "32 ₺": 5]

我想从它们的值中获取耦合数组和arraysPrice,并且我想根据正确的索引获取arrays.keys。当我尝试制作它时,arrays.keys 会出现错误的顺序。 (因为它是按上面显示的顺序排列的。)有人可以帮我吗?我希望我能问清楚。

【问题讨论】:

  • 您的arrays 不是数组。它是一本字典。你的arraysPrice 也是一本字典。字典没有顺序。它打印出来的顺序是没有意义的。它没有顺序,也没有索引。
  • @matt 你说得对,我很困惑。我该如何解决?
  • 对不起,我不明白你的意思。没有什么可以解决的。
  • 请告诉您要在 4 个输入值中输出什么 ..??
  • @kishansuthar 我必须为我的应用程序制作订单页面,我必须获取商品名称、商品价格和商品数量。我的代码可以进行正确的计数和价格,但在项目名称中出现不同项目的价格和计数位置。我希望我解释清楚。

标签: ios arrays swift xcode


【解决方案1】:

转换为结构。否则这会继续咬你。

struct Item {
    let name: String
    let price: String // Should be a Currency type, but matching your code
}

let items = [
    Item(name: "halimiz duman aman", price: "14 ₺"),
    Item(name: "halimiz duman aman", price: "14 ₺"),
    Item(name: "halimiz duman aman", price: "14 ₺"),
    Item(name: "halimiz duman aman", price: "14 ₺"),
    Item(name: "halimiz duman aman", price: "14 ₺"),
    Item(name: "halimiz duman aman", price: "14 ₺"),
    ...
    ]

如果你碰巧有两个数组(我会避免创建它们,但如果你有它们来自服务器响应之类的其他东西),那么你可以通过“压缩”将它们转换为结构:

let orders = zip(orderItemName, orderItemPrice).map(Item.init)

“压缩”两个数组就是从每个数组中取出一个元素,并将它们变成一个元组(String, String)。然后将其传递给Item.init。当任一数组用完时,拉链就会停止(因此,如果它们的长度不同,则可能会忽略某些项目)。这个map 代码在逻辑上与:

var orders: [Item] = []
for (name, price) in zip(orderItemName, orderItemPrice) {
    orders.append(Item(name: name, price: price))
}

这样您就可以计算出您要查找的计数。例如:

func count(name: String, in items: [Item]) {
    return items.filter(where: { $0.name == name }).count
}

您可以通过一次计算所有名称来创建您要查找的特定字典。

func nameCounts(from items: [Item]) -> [String: Int] {
    var result: [String: Int] = [:]

    for item in items {
        result[item.name, default: 0] += 1
    }

    return result
}

或者用更花哨的方式:

func nameCounts(from items: [Item]) -> [String: Int] {
    return items.reduce(into: [:]) { $0[$1.name, default: 0] += 1 }
}

这里的关键教训是,您应该将与单个事物相关的所有数据放入一个结构中,然后将这些结构组成一个数组。不要将它分散到多个数组中。


对于未来的学习(这可能对你来说太高级了),上面可以像这样非常通用:

extension Sequence  {
    func counts<Value: Hashable>(of keyPath: KeyPath<Element, Value>) -> [Value: Int] {
        return self.reduce(into: [:]) { $0[$1[keyPath: keyPath], default: 0] += 1 }
    }
}

这允许您执行以下操作:

items.counts(of: \.name)
items.counts(of: \.price)

但是当您开始使用这种通用代码时,您不必太担心。第一个for...in 代码非常好。

【讨论】:

  • 感谢您的回答。我想再问一件事我有两个数组。其中一个给项目名称和其他项目价格我如何将结构添加到这些数组?
  • 与开头描述的完全一样。没有两个数组。有一个具有两个属性的数组。管理两个同步的数组非常困难,而且你会经常遇到错误,因为很难考虑。不要那样做。
  • (但也更新了如何使用 zip 将现有数组转换为结构)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多