我想将一个给定的字符串“解析”为向量。向量以“[”开头,以“]”结尾。矢量的值以及矢量本身由“,”分隔。如果我使用整数作为值,我的代码工作正常“[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);
}
}
答案 0 :(得分:4)
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);
答案 1 :(得分: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);
}
答案 2 :(得分:0)
不推荐使用StringTokenizer,您应该使用字符串split()