给出一个表达式,例如" 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
从这里开始,如果这一点甚至是正确的,我不知道该往哪里去。任何帮助/指向我正确的方向将不胜感激。
答案 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 );
}