0

文字列の配列に有効な数値が含まれていることを確認するプログラムを作成します。文字列に「。」が含まれている場合はDoubleに変換し、そうでない場合は整数に変換します。入力は文字列の配列{"10.20"、 "123456"、 "12 。無効"}。

私の問題は、123456がdoubleに変更されていることです。intに変更する必要があります。助けてください:(

public class Ch7LU3Ex1
{
    public static void main(String[] args)
    {
        String[] str = new String []{"10.20","123456","12.invalid"};
        int i,count=0;
        try
        {
            for(i=0;i<3;i++)
            {
                int l = str[i].length();
                for(int j=0;j<l;j++)
                {
                    if(str[i].charAt(j)=='.')
                    {
                        count++;
                    }
                    else
                    {
                        continue;
                    }
                }
                if(count!=0)
                {
                    double d = Double.parseDouble(str[i]);
                    System.out.println(d);
                }
                else
                {
                    int e = Integer.parseInt(str[i]);
                    System.out.println(e);
                }
            }
        }
        catch(NumberFormatException e)
        {
            System.out.println("Invalid number");
        }
    }
}
4

7 に答える 7

5
if(str[i].indexOf('.') == -1) {
    int e = Integer.parseInt(str[i]);
}
else {
    double d = Double.parseDouble(str[i]);
}

これは、すべての不要なループよりもはるかにエレガントです。幸運を!

これがどのように機能するかを理解するには、 indexOf() の String API を参照してください

于 2012-12-29T16:21:06.593 に答える
2

現在使用している方法については、各反復でcounttoをリセットする必要があり0ます。そうしないと、最初の double 値が見つかった後の各値が double に変換されます。count値はnon-zeroすべての場合にあるためです。

したがって、最初の for ループでは、次のように開始時にカウントをリセットする必要があります。

for(i=0;i<3;i++)
{
    count = 0;

今、あなたは本当にあなたの仕事を複雑にしています。count変数を使用する必要はまったくありません。また、そこは必要ありませんnested loop。このような単純な 1 つのループを実行できます。個々のキャラクターを自分で操作しないでください。Java ライブラリには、すでにそれを行っているメソッドがあります。代わりにそれらを使用してください: -

for (String str: arr) {
    if (str.contains(".")) {
        double d = Double.parseDouble(str);
    } else {
        int i = Integer.parseInt(str);
    }
}

使用されるループは、拡張 for ループと呼ばれます。

String#contains()メソッドは、文字列に特定の文字が含まれているかどうかをチェックします。または、メソッドを使用して、文字列内String#indexOf()のインデックスを見つけることができ.ます。正の値を返す場合、文字列にはその文字が含まれます。

于 2012-12-29T16:21:42.643 に答える
2

私はループをまったく使用しません。ランダムなデータがなく、各「列」のタイプが必要であることを知っていると思います。

String[] str = {"10.20", "123456", "12.invalid"};

double d = Double.parseDouble(str[0]);
int i = Integer.parseInt(str[1]);
String s = str[2];

double値が a であるかであるかがわからない場合はint、精度を失うことなく常に double として解析できます。

于 2012-12-29T16:24:50.720 に答える
1

文字列ごとにカウントをゼロに戻す必要があり、それを行っていないようです。

于 2012-12-29T16:21:28.170 に答える
0

1 回の繰り返しで再度カウントをゼロcount=0に設定した後、2 回目の繰り返しではカウントがゼロではないため、再度 double 値と見なします

于 2012-12-29T16:21:14.767 に答える
0

要素を調べるたびに、count 変数を 0 にリセットする必要があります。「10.20」にはドットが含まれており、「123456」ではリセットされないため、このようにカウントがインクリメントされます。

于 2012-12-29T16:21:46.017 に答える
0

あなたのコードは少しごちゃごちゃしていますが、要点は、 の各メンバーのカウントをリセットしないことですstr

したがってcounter=0;、1 つの文字列のすべての文字を処理するループに a を追加すると、おそらく必要なものが得られるでしょうか?

いくつかの追加のヒント:

  • 読みやすい変数名を使用する
  • コードをインデントする
于 2012-12-29T16:21:52.770 に答える