【问题标题】:Using StringTokenizer to separate scalar variables from array variables?使用 StringTokenizer 将标量变量与数组变量分开?
【发布时间】:2015-10-10 16:22:10
【问题描述】:

给定一个表达式,例如“arrayA[arrayA[9]*(arrayA[3]+2)+1]-varx”,我试图将标量变量 (x) 与数组变量 (A) 分开,所以我可以将这些值存储在两个单独的 ArrayList 中。我以前从未使用过 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

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

【问题讨论】:

  • 您想使用 Scanner 还是 StringTokenizer - 是什么?
  • 如果数组变量都以“array”为前缀,标量变量以“var”为前缀:问题出在哪里?
  • 判断它是否是数组的唯一方法是它后面是否跟着 [ 。例如,可能有一个数组 varx[ ].

标签: java arraylist stringtokenizer


【解决方案1】:

(已弃用)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 );
}

【讨论】:

  • 不幸的是,我必须使用 StringTokenizer 或其他不需要任何导入语句的方法。
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
相关资源
最近更新 更多