簡體   English   中英

NSExpresseion,確定從左關聯操作

[英]NSExpresseion, determine operating from left-associative

func postFix(_ expr: String) -> Int {
    // write your code here
    let nums = expr.components(separatedBy:CharacterSet.decimalDigits.inverted)
        .joined()
    let set = CharacterSet(charactersIn: "+*/%-")
    var ch = expr.components(separatedBy: set.inverted).joined()
    ch.append(" ")
    var rslt = String()


    for i in 0..<nums.count {
        let index = str.index(str.startIndex, offsetBy: i)
        rslt.append(nums[index])
        rslt.append(ch[index])
    }
    let theSet = CharacterSet(charactersIn: "+*/%-0123456789")
    let final = rslt.components(separatedBy: theSet.inverted).joined()
    let expn = NSExpression(format: final)
    let chal = expn.expressionValue(with: nil, context: nil)

    return  chal as! Int
}
print(postFix("4 1 - 2 *"))

我正在制作一種方法來從未排序的字符串中解析數學運算,我面臨的唯一問題是我無法確定從左關聯進行運算。 而不是 4 - (1 * 2) = 2 我希望它從左側開始並忽略是否以 * 或 / 首先所以 (4 - 1 ) * 2 = 6

我會稍微改變你的邏輯。 首先獲取所有數字和所有運算符,然后獲取第一個元素並將其用作 lhs,迭代數字和刪除第一個數字的運算符。 使用 lhs + 運算符 + 當前數字 (rhs) 構造您的表達式。 將結果分配給 var,下一個 lhs 將是轉換為字符串的結果。 就像是:


func postFix(_ expr: String) -> Int {
    let numbers = expr.split(whereSeparator: {!"0123456789".contains($0)})
    let operators = expr.split(whereSeparator: {!"+*/%-".contains($0)} )
    guard var lhs = numbers.first else { return .zero }
    var result = 0
    for (rhs, oprtr) in zip(numbers.dropFirst(),operators)  {
        let format = String([lhs,rhs].joined(separator: " " + oprtr + " "))
        result = NSExpression(format: format)
            .expressionValue(with: nil, context: nil) as? Int ?? 0
        lhs = String(result)[...]
    }
    return  result
}

print(postFix("4 1 - 2 *"))  // "6\n"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM