【问题标题】:Modifying Nested Array Entries in Swift在 Swift 中修改嵌套数组条目
【发布时间】:2018-02-07 06:50:54
【问题描述】:

我在 Swift 中有一个嵌套数组,其中每个内部数组的大小可能不同:

let numbers = [[0], [1], [2, 3], [4]]

问题是我需要根据单个索引值修改一个条目(基本上基于展平数组的索引;所以在这个例子中,每个值本质上都是它的索引)。

我通过flatMap 调用解决了一半的问题,但我不确定之后如何重新嵌套它,或者我是否一开始就采取了错误的方法。

func setValue(_ value: Int, index: Int, list: [[Int]]) -> [[Int]]
{
    var output = numbers.flatMap { $0 }
    output[index] = value

    // TODO: Re-nest

    return [output]
}

let output = setValue(42, index: 3, list: numbers)
print(output) // [[0, 1, 2, 42, 4]]

如何输出[[0], [1], [2, 42], [4]],是否有更优雅(实用)的方式来实现?

【问题讨论】:

  • 我不是 swift 程序员,但你试过了吗:numbers[2][1] = 7;
  • @TheUnholyProgrammer 嵌套数组的大小可以不同,因此您可以有 [[2, 12, 14], [5], [6]],其中索引 3 指的是 5。跨度>
  • 尝试使用数字[2].length;
  • @XmasRights 我认为您的问题是迫切需要一种新的数据类型,以更智能地管理 [[Int]] 支持的操作

标签: arrays swift functional-programming


【解决方案1】:

我有一个使用两张地图的(有点)实用的解决方案。

func setValue(_ value: Int, index: Int, list: [[Int]]) -> [[Int]] {
    var i = -1
    return list.map { arr in
        return arr.map { e in
            i += 1
            if (i == index) { return value }
            else { return e }
        }
    }
}

我没有太多时间想一个聪明的方法来解决这个问题,但这是我的老生常谈。

【讨论】:

    【解决方案2】:

    继续遍历子数组,直到达到指定的index,然后计算它在该子数组中的偏移量:

    func setValue(_ value: Int, index: Int, list: [[Int]]) -> [[Int]]
    {
        var output = list
        var cumulativeCount = 0
    
        for i in 0..<output.count {
            if cumulativeCount + output[i].count > index {
                output[i][index - cumulativeCount] = value
                break
            } else {
                cumulativeCount += output[i].count
            }
        }
    
        return output
    }
    
    print(setValue(42, index: 3, list: [[0], [1], [2, 3], [4]]))
    print(setValue(42, index: 3, list:  [[2, 12, 14], [5], [6]]))
    

    但是,这不会检查index 是否在list 的范围内。如果你在这个例子中设置index = 100,函数不会改变任何东西。

    Code Snippet on IBM Bluemix

    【讨论】:

      【解决方案3】:

      试试这个,让我知道它是否适合你。

      var numbers = [[0], [1], [2, 3], [4]]
      func setValue(_ value: Int, index: Int, list: inout [[Int]]) {
          var listS: [Int] = list[index]
          listS.append(value)
          list[index] = listS    
      }
      
      setValue(42, index: 2, list: &numbers)
      print(numbers) // [[0], [1], [2, 3, 42], [4]]
      

      【讨论】:

        猜你喜欢
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        相关资源
        最近更新 更多