【问题标题】:How to find first index of an element in array of arrays如何在数组数组中找到元素的第一个索引
【发布时间】:2021-10-27 21:57:17
【问题描述】:

我有一个数组,比如

var arr = [[("aa",1),("b",2)],[("c",3),("dd",4)],[("e",5),("f",6)]]

我想在arr 中找到dd 的第一个索引。我正在尝试这段代码,但没有得到结果

let val = arr.first(where: {$0.1 == "dd" })

【问题讨论】:

    标签: ios arrays swift


    【解决方案1】:

    从您的代码中,每个字母都有一个值,例如“aa”为 1,“b”为 2,依此类推。

    如果你想找到“dd”对应的值,我建议你使用Hashmaps/Dictionary!!

    所以你的代码将是

       var values = ["aa":1, "b":2, "c":3, "dd":4, "e":5, "f":6]
       let val = values["dd"] //val = 4
    

    【讨论】:

    • 虽然使用字典而不是元组数组当然是一个很好的解决方案,但您错过了 OP 有一个带有元组的数组数组这一点,因此您使用这个答案松散了内部数组。
    • 你说的OP是什么意思??抱歉,我回答了这个问题,因为我认为使用字典会更容易
    • OP 是网上常用的首字母缩略词,指提出问题或发起讨论的人,OP = Original Poster。正如我所提到的,这里的字典并不真正起作用,因为它是一个数组数组,因此数据被分组在一起。
    • 哦!我的错,对不起,谢谢@JoakimDanielson!
    【解决方案2】:

    首先,元组从 0 开始索引,因此它应该是 $0.0 并且要找到您需要使用 firstIndex 的索引,最后,由于您有一个数组数组,您需要向下钻取一个级别,然后在您返回时返回在内部数组中有匹配项,我使用 contains 作为内部数组

    let val = arr.firstIndex(where: { 
        $0.contains(where: { tuple in tuple.0 == "dd" })
    })
    

    【讨论】:

    • 很好的答案,我一直在琢磨这个问题,并认为几乎得到了它,但我认为我离这个答案还很远:]
    【解决方案3】:

    val 在这种情况下将是第二个内部数组。第一个包含“dd”的内部数组

    let val = arr.first(where: { $0.first(where: { $0.0 == "dd" }) != nil } )
    

    【讨论】:

      【解决方案4】:

      您使用了multi-dimensional arrays,请说明您要查找哪个索引(内部/外部索引)。

      如果您指的是外部数组索引:

      let outerIndex = arr.firstIndex(where: { $0.contains(where: { $0.0 == "dd"}) })
      

      如果你的意思是内部数组索引:

      let innerIndex = arr.map({ $0.firstIndex(where: { $0.0 == "dd" }) }).filter({ $0 != nil }).first
      

      如果您需要两个索引:

      var bothIndex: (outer: Int?, inner: Int?) {
          guard let outerIndex: Int = arr.firstIndex(where: { $0.contains(where: { $0.0 == "dd"}) }) else {
              assertionFailure()
              return (nil,nil)
          }
          
          let innerIndex: Int? = arr[outerIndex].firstIndex(where: { $0.0 == "dd"})
          return (outerIndex, innerIndex)
      }
      

      【讨论】:

        【解决方案5】:

        你有一个数组数组。您需要外部数组和内部数组的索引:


        var arr = [[("aa",1),("b",2)],[("c",3),("dd",4)],[("e",5),("f",6)]]
        
        let predicate: ((String,Int)) -> Bool = { $0.0 == "dd" }
        if let index = arr.firstIndex(where: {$0.contains(where: predicate)}),
            let subIndex = arr[index].firstIndex(where: predicate) {
            print(arr[index][subIndex])  // ("dd", 4)
        }
        

        扩展该主题:

        extension Collection where Element: Collection {
            func firstIndexAndSubIndex(where predicate: (Element.Element) -> Bool) -> (index: Index, subIndex: Element.Index)? {
                if let index = firstIndex(where: {$0.contains(where: predicate)}),
                    let subIndex = self[index].firstIndex(where: predicate) {
                    return (index,subIndex)
                }
                return nil
            }
        }
        

        用法:

        var arr = [[("aa",1),("b",2)],[("c",3),("dd",4)],[("e",5),("f",6)]]
        
        if let idxs = arr.firstIndexAndSubIndex(where: { $0.0 == "dd" } ) {
            print(arr[idxs.index][idxs.subIndex])  // ("dd", 4)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多