访问ArrayList中其他项之间的所有项

时间:2013-01-25 08:05:18

标签: java math arraylist

给出ArrayList形式:

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

我想访问括号之间的所有项目,然后对这些项目运行方法。

要做到这一点,我将不得不说:

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

括号不会始终处于相同位置,并且它们之间的项目数量会有所不同。我将如何访问这些项目?

3 个答案:

答案 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));
    } 
}

参考:stackoverflow

答案 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)
}

这只适用于“(”和“)”的完全出现,但您可以很容易地根据需要修改代码。