ているどのように多くのint、ダブルス、数学演算子を決定:私は、たとえば、持っているどのように多くのint型と文字列を倍増決定しようとしている:文字列は、私が問題に持って
12.5+45-(67.78)*3
期待した結果が:
2 Ints: 45, 3
2 Doubles: 12.5, 67.78
7 symbols: .,+,-,(,.,),*
どうすればよいですか?
ありがとうございます。私は完全にスウィフトに新しいです
ているどのように多くのint、ダブルス、数学演算子を決定:私は、たとえば、持っているどのように多くのint型と文字列を倍増決定しようとしている:文字列は、私が問題に持って
12.5+45-(67.78)*3
期待した結果が:
2 Ints: 45, 3
2 Doubles: 12.5, 67.78
7 symbols: .,+,-,(,.,),*
どうすればよいですか?
ありがとうございます。私は完全にスウィフトに新しいです
私は分解を示唆しています部分文字列の式を使用して、個々のコンポーネントにアクセスできるように配列に情報を配置します。
最初のレベルの解析が完了したら、演算子、整数、数値などを数えやすくなります。
ことはここでは、解析された配列を生成できる方法の例です:
let formula = "10+12.44/(3.14*7+20)"
let operators = "+-*/()"
let operSet = Set(operators.characters)
let flags = formula.characters.indices
.map{($0,operSet.contains(formula[$0]))}
// [(String.Index,Bool)]
let starts = zip(flags, [(formula.startIndex,true)] + flags)
.filter{ $0.1 || $1.1 }.map{$0.0.0}
// [String.Index]
let parsed = zip(starts, starts.dropFirst() + [formula.endIndex])
.map{ (string:formula[$0..<$1], start:$0, end:$1) }
// [(String, String.Index, String.Index)]
// parsed will contain tupples with substrings and start/end indexes
//
// .string .start .end
// ------- ------ ----
// 10 0 2
// + 2 3
// 12.44 3 8
// / 8 9
// ( 9 10
// 3.14 10 14
// * 14 15
// 7 15 16
// + 16 17
// 20 17 19
// ) 19 20
それぞれに到達するためにあなたは、あなたの様々なニーズに合わせて、この配列を使用することができると、ボーナスとしてあなたは.startと.ENDを持っていますフォーミュラのサブストリングのそれが動作
let operators = parsed.filter{operators.contains($0.string)}
let integers = parsed.filter{Int($0.string) != nil}
let decimals = parsed.filter{$0.string.contains(".")}
方法は、まず、オペレータ(フラグ変数)に対応するすべての文字列インデックスフラグを立てることです。
式の部分文字列は、各演算子および演算子に続く文字(開始変数)で開始します。
式の部分文字列の開始位置の文字列インデックスをすべて取得したら、その文字列を範囲(つまり、最初から次の文字列)に変換し、部分文字列を配列に抽出する必要があります。
私は配列に部分文字列を配置することができましたが、数式文字列の位置が必要になるため、インデックス範囲と解析された変数のタプルを作成しました。
構文解析された配列を持つと、演算子や整数などを数えることはフィルタリングの単純な問題になります。
これは、1文字の演算子でのみ機能することに注意してください。
NSRegularExpression
は、すべての文字列を検索することができます。これは、文字列から数値を取得する例です。
あなたはフロート番号取得するには、この正規表現文字列を使用することができます。int番号を取得するには"\d+\.\d+"
またはこれを:"\\d+"
let math = "+-/*()"
let teststring = "10+12.44/(3.14*7+20)"
let isOperator = { c in
math.characters.contains(c)
}
let numbers = teststring.characters.split(whereSeparator: isOperator).map(String.init)
let operators = teststring.characters.filter(isOperator)
let integers = numbers.flatMap { Int($0) }
let doubles = numbers.flatMap { c->Double? in
if let i = Int(c) {
return nil
} else {
return Double(c)
}
}
print("\(operators.count) operators \(operators)")
print("\(integers.count) integers \(integers)")
print("\(doubles.count) doubles \(doubles)")
/* prints
6 operators ["+", "/", "(", "*", "+", ")"]
3 integers [10, 7, 20]
2 doubles [12.44, 3.1400000000000001]
*/
ありがとう、それは私のために素晴らしい作品:) –