我目前正在开发一款用于化学计算的小应用程序。我试图编程一个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() }
}
答案 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