4

オブジェクト、MyString を作成しました。valueOf(double d) を再作成する方法がわかりません。整数の valueOf を再作成しました。簡単にするために、小数点以下の桁数を 8 に制限しました。valueOf(double d) を再作成するにはどうすればよいですか?

public class MyString {

private char[] a;

public MyString(String s) {
    this.a = s.toCharArray();
}

public MyString(char[] a) {
    this.a = a;
}

public String toString() {
    return new String(a);
}

public int length() {
    return a.length;
}

public char charAt(int i) {
    return a[i];
}
    public static MyString valueOf(int i) {
    int digits = (int)(Math.log10(i)+1);
    char[] b = new char[digits];
    for (int j = 0; j < digits; j++) {
        b[j] = (char) (48 + i / 10);
        i = i % 10;
        if (i < 10) {
            b[j + 1] = (char)(48 + i);
            break;
        }
    }
    MyString ms = new MyString(b);
    return ms;
    }
public static MyString valueOf(double d) {
            char[] d1 = new char[digits];
            //Take each digit of the number and enter it into the array
            MyString ms = new MyString(d1);
    return ms;

}

public static void main(String[] args) {

}

}

4

2 に答える 2

1

私はあなたが楽しみのためにこれをやっていると思います...だからここに私が取ったアプローチがあります. valueOf(int i) は既にあるので、基本的にその関数を再利用してみませんか。double を取り、int になるまで 10 を掛け続けます。小数点以下の位置を追跡してから、基本的に valueOf(int i) を呼び出しますが、小数点も含めます。

コードの実行に問題があったため、valueOf(int i) をやり直してから valueOf(int i, int decimalSpot) を作成し、小数点に -1 または 0 を渡して、整数値で小数点以下を使用しません。 .

とにかく、ここに私が思いついたものがあります。遅いので、おそらく最もクリーンなコードではありませんが、概念の証明が得られるはずです。

public class MyString {

    private char[] a;

    public MyString(String s) {
        this.a = s.toCharArray();
    }

    public MyString(char[] a) {
       this.a = a;
    }

    public String toString() {
        return new String(a);
    }

    public int length() {
        return a.length;
    }

    public char charAt(int i) {
        return a[i];
    }

    public static MyString valueOf(int i) {
        return MyString.valueOf(i,-1);
    }

    public static MyString valueOf(double d) {
        int decimalPlace = 0;

        while (d != (int)d)
        {
            decimalPlace++;
            d = d*10;
        }

        return MyString.valueOf((int)d,decimalPlace);
    }

    public static MyString valueOf(int i, int decimalSpot) {
        int index=0;
        int digits = (int)(Math.log10(i)+1);
        int stringLength=digits;
        if (decimalSpot == 0) decimalSpot=-1; // Don't return 1234. - just return 1234
        if (decimalSpot != -1) 
        {
            // Include an extra spot for the decimal
            stringLength++;
        }
        char[] b = new char[stringLength];
        for (int j = digits-1; j >= 0; j--) {
            int power = (int) Math.pow(10,j);
            int singleDigit = (int) Math.floor(i/power);
            i = i - power*singleDigit;
            b[index++] = (char) (48 + singleDigit);

            if (decimalSpot==j)
            {
                b[index++] = '.';
            }
        }

        MyString ms = new MyString(b);
        return ms;
    }

    public static void main(String[] args) {        
        MyString ms = MyString.valueOf(12345);
        System.out.println(ms);

        ms = MyString.valueOf(12345.12313);
        System.out.println(ms);
    }

}
于 2014-01-16T06:56:52.863 に答える
0

考えられるすべてのソース データ型についてこの問題を解決しようとするのではなく、文字列からクラスを構築することに専念する必要があります。次に、このメソッドと、まだ行っていない他のすべてのメソッドを、それぞれの場合に対応する String メソッドに委譲し、結果の String を取得し、その String でオブジェクトを構築するだけです。

于 2014-01-16T06:30:45.263 に答える