2016-05-10 7 views
-4

私は電卓と似たような働きをしていますが、暗号解法の方程式を解きます。 + - * /のような基本的な操作でうまく動作します。 パワーとルートの操作を追加しました。これらの2つの新しい操作を使用すると機能しません。問題は、入力文字列を分割する方法によると思われます。問題は、文字列を "^"演算子で分割しないことです。Javaでの文字列の分割と読み込み

private void findOperator() { 
    // TODO Auto-generated method stub 
    String[] tempString = this.rawInputString.split(""); 
    for(String s : tempString){ 
     if(s.equals("+")){ 
      this.operator = "[+]"; 
      break; 
     } 
     else if(s.equals("*")){ 
      this.operator = "[*]"; 
      break; 
     } 
     else if(s.equals("-")){ 
      this.operator = s; 
      break; 
     } 
     else if(s.equals("/")){ 
      this.operator = s; 
      break; 
     } 
     else if(s.equals("^")){ 
      this.operator = s; 
      break; 
     } 
     else if(s.equals("sqrt")){ 
      this.operator = s; 
      break; 
     } 
    } 
} 

public void parseInput(){ 

    String[] tempString = rawInputString.split(this.operator); 
    this.firstString = tempString[0].split(""); 
    this.firstLetterFirstNumber = this.firstString[0]; 
    String temporarySecondPart = tempString[1];//This is where it says I 
            //have the problem, but it works fine 
            //with other operators    
    this.operator = rawInputString.substring(this.firstString.length,this.firstString.length+1); 
    tempString = temporarySecondPart.split("="); 
    this.secondString = tempString[0].split(""); 
    this.firstLetterSecondNUmber = this.secondString[0]; 
    this.result = tempString[1].split(""); 
    this.firstLetterResult = this.result[0]; 


} 
+0

そして "問題" は何ですか? –

+1

"^"で分割しようとすると文字列が分割されません。 – Keselme

+1

'toCharArray()'が基本的に同じ処理をする場合、 'split(" ")'を使って文字列を1文字の要素に分割するのはなぜですか? --- 's'は1文字の値だけなので、' sqrt "とどのようにマッチすると思いますか? – Andreas

答えて

2

splitは、引数として正規表現(regex)を使用している:ここで問題が発生するコードがあります。文字の中には、正規表現にspecial meaning(メタキャラクタと呼ぶ)と^があります。これは通常、文字列の開始を表します。または、[^a-z]のように負の文字セットを作成すると、範囲azにない文字を表します。

あなたは、単純なリテラルに^を変更したい場合は、

split("\\^")

ようにそれをエスケープする必要がありますが、より安全な方法は、正規表現があなたのためにエスケープを行うにできるようにすることでしょう。そう

split(Pattern.quote("^"))

か、あなたのケース

split(Pattern.quote(operator))に使用することができません。

+0

ありがとう!出来た! – Keselme

0

String abc = "a+b-c*d^f"; 
String reg = "((?<=[<=|>=|==|\\+|\\*|\\-|<|>|/|=|\\^])|(?=[<=|>=|==|\\+|\\*|\\-|<|>|/|=|\\^]))"; 

    String [] arr = abc.split(reg); //split your String according to Expression 
    for(String obj : arr) 
    System.out.println(obj); 

があなたのアウトプットは、その

a 
+ 
b 
- 
c 
* 
d 
^ 
f 

ノートのようになります。この正規表現を試してみる: - あなたの完全な数学的表現はただの数学を見つけることによって、文字列の配列に分割されます行の表現

+0

これらの '['と ']'が必要ですか?最初と最後の '(' ')について同じ質問: – Pshemo

+0

ヒント:' [<=|> =] 'は、あなたが思うとは思っていません。 – Pshemo

+0

私はちょうどヒントのための '正規表現'を書いています。あなたはあなたの必要に応じて自分で書くことができます。必要に応じて式を追加または削除することをお勧めします。 @Pshemoありがとう –

2

奇妙なジャンプをしていますそのコードのhフープ。

findOperator()最初+*-/、又は^を検索し、次に、1文字列にrawInputStringを分割(無視sqrt非作動)と正規表現としてthis.operatorに割り当てます。

次に、その正規表現を使用してrawInputStringを分割します。どうして?
あなたはちょうどfindOperator()にそれを見つけたので、それがどこにあるのか正確に分かります。

次にあなたが分割し、分割し、分割を開始

...あなたがしたいすべてが文字列 a op b = cを解析している

すべてのこと

、?
そして、あなたはフィールドにそれをすべて保存したいように見える:

firstString a as a String[] of 1-character 
operator  op 
secondString b as a String[] of 1-character 
result   c as a String[] of 1-character 

firstLetterFirstNumber First 1-character string in firstString 
firstLetterSecondNUmber First 1-character string in secondString 
firstLetterResult  First 1-character string in result 

そして何ハンドリングエラーがないので、あなたではなく、いくつかの意味のあるエラーのため、ArrayIndexOutOfBoundsExceptionを取得します。

ただの正規表現を使用すると、すべての値がすぐに使用できます。
toCharArray()を使用すると、1文字の値はchar[]となります。

String rawInputString = "3√343=7"; 

String regex = "(.+?)([-+*/^√])(.+?)=(.+)"; 
Matcher m = Pattern.compile(regex).matcher(rawInputString); 
if (! m.matches()) 
    throw new IllegalArgumentException("Bad input: " + rawInputString); 

char[] firstString = m.group(1).toCharArray(); 
String operator  = m.group(2); 
char[] secondString = m.group(3).toCharArray(); 
char[] result  = m.group(4).toCharArray(); 

char firstLetterFirstNumber = firstString[0]; 
char firstLetterSecondNUmber = secondString[0]; 
char firstLetterResult  = result[0]; 

System.out.println("firstString = " + Arrays.toString(firstString)); 
System.out.println("operator  = " + operator); 
System.out.println("secondString = " + Arrays.toString(secondString)); 
System.out.println("result  = " + Arrays.toString(result)); 

OUTPUT

firstString = [3] 
operator  = √ 
secondString = [3, 4, 3] 
result  = [7] 
関連する問題