1

ArrayList次の形式の が与えられた場合:

{ "(", "2", "+", "4", ")", "/", "2"}

括弧内のすべてのアイテムにアクセスして、それらのアイテムに対してメソッドを実行したいと考えています。

これを行うには、次のように言う必要があります。

while(arrayList.contains("(")&&arrayList.contains(")")){
    // access the items between the brackets
}

ブラケットは常に同じ位置にあるとは限らず、その間にさまざまな数のアイテムがあります。それらのアイテムにアクセスするにはどうすればよいですか?

4

3 に答える 3

4

配列リスト内のブラケットのインデックスを取得する必要があります。使用するデータ構造については、javadoc を調べて、それを使用して何ができるかについての情報を取得する必要があると思います。ArrayList.contains() は ArrayList の便利なメソッドですが、この状況では ArrayList.indexOf() の方が便利です。

public int indexOf(Object o)

Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element. More formally, returns the lowest index i such that (o==null ? get(i)==null : o.equals(get(i))), or -1 if there is no such index.

このメソッドを使用すると、2 つの連続する開き括弧と閉じ括弧が存在する場合、それらのインデックスを取得できます。インデックスを取得したら、インデックス間を反復できます。ちょっとパース作業なので、再帰的なメソッドを実装しようとすると手を汚すかもしれません。例: { "(", "(","2", "+", "4", ")", " /"、"2"、")"}。このようなネストされたステートメントについては、さらに調査する必要があります。

知っておくべきことは、複雑なステートメントのツリーです。ツリーのデータ構造を確認することを強くお勧めします。

編集:この問題に対する多数のスタック実装も見つけることができます。キーワード: スタック式パーサー アルゴリズム。

于 2013-01-25T08:24:20.900 に答える
3

あなたはこのようなことをすることができます:

ArrayList<String> list; // The list you want to process
for (int i = list.indexOf("(") + 1; i < list.indexOf(")"); i++) {
    // Do something with list.get(i)
}

これは、「(」と「)」が1回だけ発生した場合にのみ機能しますが、必要に応じてコードを非常に簡単に変更できます。

于 2013-01-25T08:29:46.880 に答える
3

このようなものを使用してください

String exp=/*ArrayList.toString()*/
exp=exp.replace(",","");
exp=exp.replace("[","");

式を取得した後

組み込みの Javascript エンジンを使用できます。

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;

public class Test {
  public static void main(String[] args) throws Exception{
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("JavaScript");
    String foo = "40+2";
    System.out.println(engine.eval(foo));
    } 
}

参照:スタックオーバーフロー

于 2013-01-25T08:17:51.897 に答える