2012-11-23 3 views
5

私も同様に=-*d/(配列(文字列の配列として)オペレータの数学的表現をデリミタとして分割し、その結果を保持する方法はありますか?

a+b-c*d/e 

のような表現を分割し、別々にabcdeを取得する必要があります)を別々に運営しています。私は次のように試しました:

String myString; 

String myString={"a+b-c*d/e"); 

String[] result=new String(); 

String[] separator=new String[]{"+","-","/","*"}; 

result=myString.split(separator); 

しかし、これはエラーを示しています。どのようにそれを解決するには?

+0

は、なぜあなたはしたいですか: - '=、 - 、*、D、/'バック? –

+0

'd'はタイプミスだと思いますか?オペランドと演算子のリストを別にしたいですか?この場合、 'd'はマッチしません... –

答えて

15

第一の問題: - String myString;

第二の問題の

複数の宣言: -

文字列が誤って初期化。両端に二重引用符がありません。ブラケットとブレースを両端から取り外します。

String myString = "a+b-c*d/e"; 

第三の問題: - Stringオブジェクトで初期化

文字列配列ではなく、配列オブジェクト。

String[] result=new String(); // Should be `new String[size]` 

実際には、事前にアレイを初期化する必要はありません。

第四の問題: -

String.splitは、引数として正規表現をとり、あなたは配列に合格しています。動作しないでしょう。

使用: -

String[] result = myString.split("[-+*/]"); 

すべての演算子に分割します。


そして、あなたのこの声明について: - 個別

など=, -, *, d, /(オペレータのも配列)。

私はあなたが欲しいものを理解していません。サンプル文字列に=が含まれていません。 doperatorではありません。編集したいかどうか確認してください。

UPDATE: - あなたは配列に同様の演算子を維持することを意味する場合は、この正規表現を使用することができます

: -

String myString= "a+b-c*d/e"; 
String[] result = myString.split("(?<=[-+*/])|(?=[-+*/])"); 
System.out.println(Arrays.toString(result)); 

/*** Just to see, what the two parts in the above regex print separately ***/ 
System.out.println(Arrays.toString(myString.split("(?<=[-+*/])"))); 
System.out.println(Arrays.toString(myString.split("(?=[-+*/])"))); 

OUTPUT: -

[a, +, b, -, c, *, d, /, e] 
[a+, b-, c*, d/, e] 
[a, +b, -c, *d, /e] 

(?<=...)は、look-behind assertionを意味し、(?=...)は、look-ahead assertion

+0

私はすべての点であなたに同意しますが、 'split'は演算子を保持しません。これは演算子が後であると思われるものです。 – npinti

+0

@npinti ..ああ、私はOPが望んでいることを理解していません。彼は彼の運営者に 'd'を含んでいたからです。 –

+0

@npinti .. Regexも追加されました。 –

0

あなたが知っている限り、あなたはすぐに箱から取り出した後は何もできません。 split(String regex)は、(C#とは異なり)配列全体を取りません。有効な正規表現を表す文字列です。

あなたができることは、演算子を含むSetと2 ArrayListsを定義することです。いったんそれを持っていれば、文字列を繰り返し処理し、セットにその文字が含まれているかどうかをチェックします(演算子かどうかを判断します)。そうであればそれを一つのリストに入れ、そうでなければ他のリストに入れます。

最後にtoArray(new String\[arraySize\])を使用して、ArrayListsを文字列配列として返すことができます。

1

ただ、A/B/C/D/Eを得るために:より読みやすい形式で

String myString = "a+b-c*d/e"; 
String[] result=myString.split("[-+*/]"); 

String myString = "a+b-c*d/e"; 
String[] result2=myString.split("["+Pattern.quote("+-*/")+"]"); 

取得するには+ - * /:

ArrayList<Character> list = new ArrayList<Character>(); 
for (char c:myString.toCharArray()) 
{ 
    if ("+-*/".contains(""+c)) list.add(c); 
} 
System.out.println(list); 

編集:不要なエスケープ文字を削除しました。

+1

文字クラスの中で '+'、 '*'をエスケープする必要はありません。 –

+0

'*'をエスケープする必要があります。 – Dukeling

+0

私はAndreasのソリューションを私の上に提案したいと思います。 – Dukeling

3

splitアプローチに加えて、あなたもjava.util.StringTokenizerを使用することができます。

String myString = "a+b-c*d/e"; 

List<String> operatorList = new ArrayList<String>(); 
List<String> operandList = new ArrayList<String>(); 
StringTokenizer st = new StringTokenizer(myString, "+-*/", true); 
while (st.hasMoreTokens()) { 
    String token = st.nextToken(); 

    if ("+-/*".contains(token)) { 
     operatorList.add(token); 
    } else { 
     operandList.add(token); 
    } 
} 

System.out.println("Operators:" + operatorList); 
System.out.println("Operands:" + operandList); 

の検索結果を:

Operators:[+, -, *, /] 
Operands:[a, b, c, d, e] 
0

私はあなたが何をしたいのかと思いますが、むしろトークナイザよりも、より多くのパーサのようなものです。文字列トークナイザで

、あなたは通常、長い文字列(すなわち、「パラメーター1、パラメーター2、パラメーター3」)を有する連結いくつかの要素とし、これらの要素を分離するために、「トークン」を使用。関数 "String.split"では、基本的には次のように言っています: "Ok、この文字列のすべての要素を与えますが、その文字を考慮してください; '異なる要素を分離する "。そして、あなたは "parameter1"、 "parameter2"、 "parameter3"を得る。セパレータは気にしません。

しかし、あなたのような数式に: "A + B-Cの*のD/E" は、すべての個々の要素(オペランドと演算子)を取得したいです。ここには明示的なセパレータはなく、順序も重要です。私はパーサーライブラリを使用し、代わりに小さな文法を書いています。