检查并仅从字符串数组中获取Int

时间:2016-10-31 16:43:32

标签: arrays swift string int swift3

我目前正在开发一款用于化学计算的小应用程序。我试图编程一个Mol计算器,你只需要输入总和公式及其数量。没有任何数字它可以完美地工作,例如,如果我输入NaCl的量为100克(您在不同的文本字段中输入克),则得到约1.73 mol,这是正确的解决方案。

我现在要做的是我可以添加数字,例如Na2Cl4。在我的方法中,字符串被正确分割,如果你打印它,你得到["Na", "2", "Cl", "4"],但我不知道我怎么能得到Int的,并记住他们被分配到哪个元素(2到Na和4到Cl,因为我需要将mol / g乘以2)。

我尝试了以下内容: 这个数字总是在一个奇数索引上(Na为0,2为1,Cl为2,4,4为3),所以我试图将每个元素放在一个奇数索引中进入一个新数组:

var i = 0
    var testarray = [String]()

    for content in splitted {
        if i % 2 == 0 {

        }else {
        testarray.append(content)
        }
        print(content)
        i += 1
    }

splitted是[String]数组,其中包含splitted sum公式。我得到的结果如果我打印出的内容是2和4这很好但是如果我输入例如Na10我得到1和0这是不好的,也不知道它被分配给哪个元素。

有没有人知道如何解决这个问题,我可以从字符串数组中获取Int值并记住它们被分配给哪个元素?

提前致谢!

修改

下面是代码如何分割字符串:

let splitted = summenformel.characters.splitBefore(separator: { $0.isUpperCase }).map{String($0)}

和扩展名:

    extension Sequence {
    func splitBefore(
        separator isSeparator: (Iterator.Element) throws -> Bool
        ) rethrows -> [AnySequence<Iterator.Element>] {
        var result: [AnySequence<Iterator.Element>] = []
        var subSequence: [Iterator.Element] = []

        var iterator = self.makeIterator()
        while let element = iterator.next() {
            if try isSeparator(element) {
                if !subSequence.isEmpty {
                    result.append(AnySequence(subSequence))
                }
                subSequence = [element]
            }
            else {
                subSequence.append(element)
            }
        }
        result.append(AnySequence(subSequence))
        return result
    }
}

extension Character {
    var isUpperCase: Bool { return String(self) == String(self).uppercased() }
}

2 个答案:

答案 0 :(得分:1)

使用正则表达式的替代方法

正则表达式搜索:

大写字母后跟可选的小写字母,后跟可选数字

let string = "Na10Cl4"

let pattern = "([A-Z]([a-z]+)?)(\\d+)?"
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let matches = regex.matches(in: string, options: [], range: NSRange(location: 0, length: string.characters.count))
for match in matches {
  let elementRange = match.rangeAt(1) // capture group of the element
  let element = (string as NSString).substring(with: elementRange)
  print("element", element)
  let quantityRange = match.rangeAt(3) // capture group of the quantity
  let quantity : Int
  if quantityRange.location != NSNotFound {
    quantity = Int((string as NSString).substring(with: quantityRange))!
  } else {
    quantity = 1
  }
  print("quantity", quantity)
}

答案 1 :(得分:0)

看来你在这里有几个问题。我会尽力解决这些问题。

拆分字符串

idt_day

因此,这会为您提供var elements: [String]; var nums: [Int]; let input: String = "Na2Cl4" for (index,char) in input.characters.enumerate() { if char.lowercaseString != char { //Is uppercase letter elements.append(char + input[index + 1]) //Add the element "Na" to the elements array. }else if Int(char) != nil { var tempInt = char if input[index + 1] != nil { tempInt += input[index + 1] } nums.append(tempInt) //Add the integer 4 to the array. } } ["Na","Cl"]的数组。如果您输入[2,4],则Na10Cl25数组elements nums <{1}}

数学

现在有了两个单独的数组,您可以轻松地知道哪个[10,25]属于哪个元素。

Int