首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否存在将链接列表转换为数组的高阶函数?

是否存在将链接列表转换为数组的高阶函数?
EN

Stack Overflow用户
提问于 2020-10-18 22:46:00
回答 2查看 109关注 0票数 1

假设我有一个简单的链接列表:

代码语言:javascript
运行
复制
class Node {
  var parent: Node?
}


// Create the chain: a <- b <- c
let a = Node()
let b = Node(parent: a)
let c = Node(parent: b)

现在,我想将c转换为数组([c, b, a]),这样我就可以使用其他高阶函数,比如map。

什么方法可以从通常被调用的链接列表中生成数组?

有没有一种方法可以使用其他高阶函数来实现这一点,而不是使用循环呢?

我能想到的唯一实现回到使用循环:

代码语言:javascript
运行
复制
func chain<T>(_ initial: T, _ next: (T) -> T?) -> [T] {
  var result = [initial]
  while let n = next(result.last!) {
    result.append(n)
  }
  return result
}

chain(c) { $0.parent } // == [c, b, a]

我想知道是否有一种内置的方法来使用map/减/等函数来获得相同的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-18 23:09:36

您可以使用sequence(first:next:)创建一个Sequence,然后使用Array()将该序列转换为一个数组:

代码语言:javascript
运行
复制
let result = Array(sequence(first: c, next: { $0.parent }))

或相当于:

代码语言:javascript
运行
复制
let result = Array(sequence(first: c, next: \.parent))

您可以使用它来实现chain

代码语言:javascript
运行
复制
func chain<T>(_ initial: T, _ next: @escaping (T) -> T?) -> [T] {
    Array(sequence(first: initial, next: next))
}

但我会直接用它。

注:--如果您只想调用map,则不需要将序列转换为Array。您只需将.map应用于序列。

例如,下面是一个无用的map,它用一个1表示链接列表中的每个节点

代码语言:javascript
运行
复制
let result = sequence(first: c, next: \.parent).map { _ in 1 }
票数 2
EN

Stack Overflow用户

发布于 2020-10-19 06:41:44

您可以使Node成为一个“变性”序列,这将自动带来所有高阶函数:mapfilterreduceflatMap等。

代码语言:javascript
运行
复制
class Node {
    var parent: Node?
    var value: String
    
    init(parent: Node? = nil, value: String = "") {
        self.parent = parent
        self.value = value
    }
    
}

extension Node: Sequence {
    struct NodeIterator: IteratorProtocol {
        var node: Node?
        
        mutating func next() -> Node? {
            let result = node
            node = node?.parent
            return result
        }
    }
    
    func makeIterator() -> NodeIterator {
        NodeIterator(node: self)
    }
}


// Create the chain: a <- b <- c
let a = Node(value: "a")
let b = Node(parent: a, value: "b")
let c = Node(parent: b, value: "c")

// each node behaves like its own sequence
print(c.map { $0.value }) // ["c", "b", "a"]

print(b.map { $0.value }) // ["b", "a"]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64419059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档