3

与えられた文字列をベクトルに「解析」したい。ベクトルは「[」で始まり、「]」で終わります。ベクトルの値とベクトル自体は、「、」で区切られます。整数を値として使用すると、コードは「[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);
   }
}
4

3 に答える 3

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

文字列の先頭から開始して、最初に出現する]inのインデックスを検索します。s本当に必要なのは、現在の vector の開始後に最初に出現するものを見つけることです。

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);
于 2012-09-23T14:24:33.957 に答える
1

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);
    }
于 2012-09-23T14:36:01.447 に答える
0

StringTokenizer は非推奨です。文字列を使用する必要がありますsplit()

于 2012-09-23T14:25:32.453 に答える