代码之家  ›  专栏  ›  技术社区  ›  mfaani

Swift是否提供任何内置函数来返回附加到不可变数组的结果?

  •  1
  • mfaani  · 技术社区  · 6 年前

    here ,我很想知道是否有更简单的方法来写以下内容:

    var nums = [1,2,3]
    
    let sum1 = nums.reduce([Int]()){
        let temp = $0
        temp.append($1)
        return temp
    }
    

    我知道我能做到:

    var nums = [1,2,3]
    
    let sum1 = nums.reduce([Int]()){
        return $0 + [$1]
    }
    

    docs )在下面,它应该是一个数组:

    let numbers = [1, 2, 3, 4]
    let numberSum = numbers.reduce(0, { x, y in
        x + y
    })
    

    编辑:

    我在做leetcode的 group Anagram's challenge .

    struct WordTraits: Equatable{
        let count: Int
        let charactersSet: Set<Character>
    }
    
    struct Word: Equatable{
        let string: String
        let wordTraits: WordTraits
    }
    
    
    class Solution{
    
        func groupAnagrams(_ strs: [String]) -> [[String]]{
    
            var words : [Word] = []
            var answers : [(traits: WordTraits, words: [Word])] = []
    
            var count = 0
            strs.forEach{ str in
                count += 1
                let count = str.count
                let string = str
                let characterSet = Set(str)
    
                let wordTraits = WordTraits(count: count, charactersSet: characterSet)
    
                let word = Word(string: string, wordTraits: wordTraits)
                words.append(word)
    
            }
            while words.count != 0{
                let word = words[0]
                let traits = word.wordTraits
                var isWordAdded = false
                for (i, answer) in answers.enumerated(){
                    if answer.traits == traits{
                        answers[i].words.append(word)
                        isWordAdded = true
                        break
                    }
                }
                if !isWordAdded{
                    answers.append((traits: traits, words:[word]))
                }
                words.removeFirst()
            }
    
            let emptyArray : [[String]] = []
            let finalAnswer = answers.reduce(emptyArray, { total, answer in
                let strings : [String] = answer.words.reduce([String](), {
    
                    return $0 + [$1.string]
                })
                return total + [strings]
            })
            return finalAnswer
        }
    }
    
    
    let s = Solution()
    print(s.groupAnagrams(["ate", "eta", "beta", "abet"])) // [["ate", "eta"], ["beta", "abet"]]
    
    5 回复  |  直到 6 年前
        1
  •  2
  •   Fabian    6 年前

    reduce(..) 必须知道它使用的是哪种类型。要推断这一点,可以使用返回类型或第一个参数的类型。所以你也可以写:

    var nums = [1,2,3]
    
    let sum1: [Int] = nums.reduce([]){
        return $0 + [$1]
    }
    

    [$1] $1

        2
  •  2
  •   Sam    6 年前

    不。但你可以加上:

    extension Array {
        func appending(_ newElement: Element) -> Array<Element> {
            return self + [newElement]
        }
        func appending(contentsOf sequence: Sequence) -> Array<Element> {
            return self + sequence
        }
    }
    
        3
  •  1
  •   Duncan C    6 年前

    嗯,那个怎么样 +

    let nums = [1, 3, 5]
    let more = nums + [7]
    
        4
  •  1
  •   Orkhan Alikhanov    6 年前

    您的代码正在尝试将复杂结构转换为数组。你可以用 map

    这应该起作用:

    let finalAnswer = answers.map { answer in
        answer.words.map {
            $0.string
        }
    }
    

    编辑: 我能用最少的代码解决它:

    class Solution {
        func groupAnagrams(_ words: [String]) -> [[String]] {
            let processedWords = words.map {
                (key: String($0.sorted()), value: $0)
            }
    
            return Dictionary(grouping: processedWords, by: { $0.key }).map { groupedValue in
                groupedValue.value.map {
                    $0.value
                }
            }
        }
    }
    
        5
  •  1
  •   Alexander    6 年前

    你对“最终答案”的计算过于复杂了。可能只是:

    return answers.map { $0.words.map { $0.string } }