使用StringTokenizer将标量变量与数组变量分开?

时间:2015-10-10 16:22:11

标签: java arraylist stringtokenizer

给出一个表达式,例如" arrayA [arrayA [9] *(arrayA [3] +2)+1] -varx"我试图将标量变量(x)与数组变量(A)分开,因此我可以将这些值存储在两个单独的ArrayLists中。我之前从未使用过StringTokenizer,所以这就是我到目前为止所做的一切。

//expr is the input String, defined previously in the code
Scanner sc = new Scanner(expr);

    while(sc.hasNextLine()){
        StringTokenizer temp = new StringTokenizer(expr); //I'm not sure what to use as delimiters

从这里开始,如果这一点甚至是正确的,我不知道该往哪里去。任何帮助/指向我正确的方向将不胜感激。

1 个答案:

答案 0 :(得分:0)

(已弃用)StringTokenizer的问题在于你真的没有分隔符,因为你需要' ['用于识别数组。 (还有什么?)所以我建议使用正则表达式:

Pattern pat = Pattern.compile( "([A-Za-z]\\w*)(\\[)?" );
Matcher mat = pat.matcher( expr );
while( mat.find() ){
    String fnd = mat.group( 1 );
    if( "[".equals( mat.group( 2 ) ) ){
        System.out.println( "array: " + fnd );
    } else {
        System.out.println( "scalar: " + fnd );
    }

第二组抓住了' ['如果它存在,那么你知道第一组的内容是数组还是标量。

编辑限制使用StringTokenizer会使问题复杂化。您必须存储令牌(分隔符之间的任何内容),直到看到分隔符。然后你可以决定它属于哪个列表。使用?:的表达式只选择合适的List对象。

String delims = "[]*+-/()0123456789";
String expr = "A[A[9]*(A[3]+2)+1]-x";
StringTokenizer st = new StringTokenizer( expr, delims, true );
List<String> arrays = new ArrayList<>();
List<String> scalars = new ArrayList<>();
String last = null;
while( st.hasMoreTokens() ){
    String token = st.nextToken();
    if( last != null ){
        ("[".equals(token) ? arrays : scalars).add( last );
        last = null;
    } else if( delims.indexOf( token ) < 0 ){
        last = token;
    }
}
if( last != null ){
    scalars.add( last );
}