Java 使用标记器分析字符串并重写toString
问题是,如果我在参数的值中键入减号Java 使用标记器分析字符串并重写toString,java,string,Java,String,问题是,如果我在参数的值中键入减号-符号,那么我会得到无效的argumentException,因为创建的四元数不等于创建的四元数,这是由于toString方法,是否有人可以帮助我修改toString或valueOf方法,以便字符串s参数在每个双精度值之前接受-符号 //constructor public Quaternion (double a, double b, double c, double d) { this.a = a; this.b = b; this
-
符号,那么我会得到无效的argumentException
,因为创建的四元数不等于创建的四元数,这是由于toString方法,是否有人可以帮助我修改toString或valueOf方法,以便字符串s
参数在每个双精度值之前接受-
符号
//constructor
public Quaternion (double a, double b, double c, double d) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(a);
if(b>=0){
sb.append("+"+b+"i");
}
if(b < 0){
sb.append(" "+b+"i");
}
if(c>=0){
sb.append("+"+c+"j");
}
if(c < 0){
sb.append("" + c +"j");
}
if(d>=0){
sb.append("+"+ d +"k");
}
if(d < 0){
sb.append(""+ d +"k");
}
return sb.toString();
}
/** Conversion from the string to the quaternion.
* Reverse to <code>toString</code> method.
* @throws IllegalArgumentException if string s does not represent
* a quaternion (defined by the <code>toString</code> method)
* @param s string of form produced by the <code>toString</code> method
* @return a quaternion represented by string s
*/
public static Quaternion valueOf (String s) {
StringTokenizer st = new StringTokenizer(s, "-+ijk ");
ArrayList fields = new ArrayList();
while (st.hasMoreTokens()){
fields.add(st.nextToken());
//System.out.println(st.nextToken());
}
double r = Double.parseDouble((String) fields.get(0));
double t = Double.parseDouble((String) fields.get(1));
double y = Double.parseDouble((String) fields.get(2));
double u = Double.parseDouble((String) fields.get(3));
Quaternion q = new Quaternion(r, t, y, u);
if(!q.toString().equals(s)) {
System.out.println("Error in input" + q);
}
return q;
}
数据成员是双精度的,因此符号应该与值相关联,而不是在
toString()
方法中设置
我会让所有这些数据成员成为最终数据。那么,四元数是不可变的:本质上是线程安全的
了解如何从Joshua Bloch的“有效Java”中正确重写equals()
和hashCode()
。Double.parseDouble(字符串xyz)方法不会解析诸如“-”、“+”、“i”、“j”、“K”等单个字符。这就是为什么你会有残疾的例外
parseDouble(字符串xyz)仅解析以字符串格式重复的有效浮点数,如
“+11.12”或“-32.11”或可转换为双倍数字的任何内容
改变如下逻辑:
Remove the stringTokenizer logic
ArrayList fields = new ArrayList();
fields .add("12.11");
fields.add("23.12");
fileds.add("-123.01");
fields.add("-67.1");
double r = Double.parseDouble((String) fields.get(0));
double t = Double.parseDouble((String) fields.get(1));
double y = Double.parseDouble((String) fields.get(2));
double u = Double.parseDouble((String) fields.get(3));
Quaternion q = new Quaternion(r, t, y, u);
传递给valueOf方法的输入是什么?
valueOf(“1.2-2.2i+3.0j-4.0k”).toString()代码>您的问题与标题不对应。您希望解析您的特定字符串,可能是使用标记器,并相应地重写您的toString。因此从我这里得到“-”。是的,这就是我为误解寻找sry的原因。如果我删除标记器,那么我无法从字符串中获得双值。是的,我知道,但也可以通过在字符串中查找符号来完成。例如,如果输入包含-sign,它将在双值之前附加-sign,以便四元数相等