问题是,如果我在valueOf参数中键入减号-
,那么我得到invalidArgumentexception
,因为由于toString方法创建的四元数不等于创建的四元数,任何人都可以帮助我修改toString或valueOf方法,以便String s
参数在每个double值之前接受-
符号。
//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;
}
答案 0 :(得分:1)
数据成员是双打的,因此标志应该与值相关联,而不是在toString()
方法中设置。
我会让所有这些数据成员最终成功。你的四元数是不可变的:本质上是线程安全的。
了解如何从Joshua Bloch的“Effective Java”chapter 3中正确覆盖equals()
和hashCode()
。
答案 1 :(得分:0)
Double.parseDouble(String xyz)方法不会解析单个字符,如&#34; - &#34;,&#34; +&#34;,&#34; i&#34;,&#34; j&#34;,&#34; K&#34;。这就是你为什么会得到无效的A gu。
Double.parseDouble(String xyz)仅以字符串格式重现的parsevalid浮点数,如
&#34 + 11.12&#34;或&#34; -32.11&#34;或任何可以转换为双号的东西。
更改逻辑如下,
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);