使用tokenizer解析字符串并重写toString

时间:2014-12-14 13:35:14

标签: java string

问题是,如果我在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; 
}

2 个答案:

答案 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);