Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用标记器分析字符串并重写toString_Java_String - Fatal编程技术网

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,以便四元数相等