繁体   English   中英

stringtokenizer返回错误的标记

[英]stringtokenizer returns wrong tokens

我想将一个给定的字符串“解析”为向量。 向量以“[”开头,以“]”结尾。 矢量的值以及矢量本身由“,”分隔。 如果我使用整数作为值,我的代码工作正常“[1,2,3],[5,2,3],[1,6,3]”。 但是,当我混合双值的整数值“[1,2.5%,3],[5,2,3],[1,6,3]”的StringTokenizer返回在这种情况下为“1”, “2.5”,但然后错误的值( “ 3] ”......)

String s = "[1,2.5,3],[5,2,3],[1,6,3]";

Vector<Vector<Double>> matrix = new Vector<Vector<Double>>();        
for(int j=0;j<s.length();j++) {
   if (s.charAt(j)=='[') {
      int k=s.indexOf("]");      
      StringTokenizer st = new StringTokenizer(s.substring(j+1, j+k));// j+k-1 does not work either
      Vector<Double> vector = new Vector<Double>();
      while (st.hasMoreTokens()) {
          vector.add(Double.parseDouble(st.nextToken(",")));//Exception in thread     "main" java.lang.NumberFormatException: For input string: "3]"
      }
      matrix.add(vector);
   }
}
if (s.charAt(j)=='[') {
    int k=s.indexOf("]"); 

发现的第一个匹配的指数]s ,从字符串的开头开始。 你真正想要的是找到当前向量开始后的第一个出现:

if (s.charAt(j)=='[') {
    int k = s.indexOf("]", j);

当你只有2而不是2.5时它起作用的原因是每个向量中的字符数碰巧是相同的,所以采用第一次出现的]来计算由运气工作的向量的长度。

注意,您还必须将substring调用的结束索引更改为k

StringTokenizer st = new StringTokenizer(s.substring(j+1, k));

另外,建议不要使用StringTokenizer 在这种情况下,您应该使用split()代替:

String[] elements = s.substring(j+1, k).split(",");
Vector<Double> vector = new Vector<Double>();
for (String element : elements) {
    vector.add(Double.parseDouble(element));
}
matrix.add(vector);

Vector和StringTokenizer? :)可爱!

    while(s.contains("[")) {
        String s1 = s.substring(s.indexOf("[")+1, s.indexOf("]"));
        if(s1!=null && s1.isEmpty()!=true && s1.contains(",") ) {
            String[] sArr = s1.split(",");
            for (String string : sArr) {
                Double d = Double.valueOf(string);
                System.out.println(d);
                // put it where you need
            }
        }
        s = s.substring(s.indexOf("]")+1);
    }

不推荐使用StringTokenizer,你应该使用字符串split()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM