给出ArrayList
形式:
{ "(", "2", "+", "4", ")", "/", "2"}
我想访问括号之间的所有项目,然后对这些项目运行方法。
要做到这一点,我将不得不说:
while(arrayList.contains("(")&&arrayList.contains(")")){
// access the items between the brackets
}
括号不会始终处于相同位置,并且它们之间的项目数量会有所不同。我将如何访问这些项目?
答案 0 :(得分:4)
您需要获取arraylist中括号的索引。对于您使用的数据结构,我认为应该查看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”,“+”,“4”,“)”,“ /“,”2“,”)“}。对于像这样的嵌套语句,你应该研究更多。
您应该知道的是复杂语句的树。我强烈建议您检查树数据结构。
编辑:您还可以找到针对此问题的大量堆栈实现。关键字:堆栈表达式解析器算法。
答案 1 :(得分: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));
}
}
答案 2 :(得分: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)
}
这只适用于“(”和“)”的完全出现,但您可以很容易地根据需要修改代码。