1

私は今朝クラスの課題に取り組んでおり、これまでにチームメイトのすべてのプログラムで気づいた問題を解決したいと考えています。int/float/double 内のスペースが原因で Java が異常終了するという事実。

この問題を解決するために、私は非常にクレイジーなアイデアを思いつきましたが、特定の状況下では機能します。ただし、問題は、常に機能するとは限らず、その理由を理解できないことです。これが私の「主な」方法です:

import java.util.Scanner;    //needed for scanner class

public class Test2
{
  public static void main(String[] args) 
  {

      BugChecking bc = new BugChecking();
      String i;
      double i2 = 0;

      Scanner in = new Scanner(System.in);   

      System.out.println("Please enter a positive integer");

      while (i2 <= 0.0)
      {
             i = in.nextLine();

             i = bc.deleteSpaces(i);  

            //cast back to float
            i2 = Double.parseDouble(i);

            if (i2 <= 0.0)
            {
                System.out.println("Please enter a number greater than 0.");
            }
      }

      in.close();
      System.out.println(i2);       
 }
}

したがって、ここにクラスがあります。私は浮動小数点数を使用していますが、文字列にキャストできる限り、任意の型に使用できるように作成したことに注意してください。

public class BugChecking
{
    BugChecking()
    {

    }

    public String deleteSpaces(String s)
    {  

        //convert string into a char array
        char[] cArray = s.toCharArray();

        //now use for loop to find and remove spaces
        for (i3 = 0; i3 < cArray.length; i3++)
        {
            if ((Character.isWhitespace(cArray[i3])) && (i3 != cArray.length)) //If current element contains a space remove it via overwrite
            {
                for (i4 = i3; i4 < cArray.length-1;i4++)
                {
                    //move array elements over by one element
                    storage1 = cArray[i4+1];
                    cArray[i4] = storage1;                  
                }
            }
        }

        s = new String(cArray);

        return s; 
    }  

    int i3; //for iteration
    int i4; //for iteration
    char storage1; //for storage
}

さて、目標は、投稿の冒頭に記載されている問題を修正するために配列からスペースを削除することです。このコードはそれを達成する必要があると私が言えることから、入力の最初の文字がスペース。

たとえば、「2.0332」と入力すると、出力は「2.0332」になります。

ただし、「2.03 445」と入力すると、出力は「2.03」になり、残りはどこかに失われます。

この 2 番目の例は、修正方法を理解しようとしているものです。

編集:

以下のDavidの提案は、問題を解決することができました. int の送信をバイパスしました。それを文字列として直接送信してから、目的の変数型に変換します (これは常にキャストと説明されています)。上記の Main メソッドに配置されたコードを修正しました。

ちょっとした注意点として、replace の方がはるかに簡単ですが、これを使用する予定がある場合は、deleteSpaces の if ステートメントに && チェックを追加して、if ステートメントが最後の配列要素でない場合にのみ実行されるようにしてください。 cArray. i3 を介して最後の要素の値を i4 を i3 の値に設定する次の for ループに渡すと、OutOfBounds エラーがトリガーされます。これは、最後の要素 - 1 までしかチェックしないためです。

4

3 に答える 3

3

またはの間のすべての空白を取り除きたい場合は、次のようにしStringます。replaceAll(String regex,String replacement)replace(char oldChar, char newChar)

    String sBefore = "2.03 445 ";

    String sAfter = sBefore.replaceAll("\\s+", "");//replace white space and tabs
    //String sAfter = sBefore.replace(' ', '');//replace white space only
    double i = 0;

    try {
        i = Double.parseDouble(sAfter);//parse to integer
    } catch (NumberFormatException nfe) {
        nfe.printStackTrace();
    }
    System.out.println(i);//2.03445

アップデート:

コード スニペットを見ると、float/int/double として直接読み取り (したがって、空白を入力すると が停止しますnextFloat())、入力をStringusingとして読み取り、空白をnextLine()削除してから、適切な形式に変換しようとすることが問題である可能性があります。 .

これは私にとってはうまくいくようです:

public static void main(String[] args) {

    //bugChecking bc = new bugChecking();
    float i = 0.0f;
    String tmp = "";

    Scanner in = new Scanner(System.in);

    System.out.println("Please enter a positive integer");

    while (true) {

        tmp = in.nextLine();//read line
        tmp = tmp.replaceAll("\\s+", "");//get rid of spaces

        if (tmp.isEmpty()) {//wrong input
            System.err.println("Please enter a number greater than 0.");
        } else {//correct input

            try{//attempt to convert sring to float
            i = new Float(tmp);
            }catch(NumberFormatException nfe) {    
                System.err.println(nfe.getMessage());
            }

            System.out.println(i);
            break;//got correct input halt loop
        }

    }
    in.close();
}

編集:

補足として、すべてのクラス名を大文字で始めてください。つまり、bugCheckingクラスBugCheckingは同じtest2である必要があります。Test2

于 2012-09-24T18:03:05.043 に答える
2

Stringオブジェクトには、この種のことを可能にするメソッドがあります。特に欲しいのはString.replace. これは、あなたがやろうとしていることをほとんど実行します。

String input = " 2.03 445 ";
input = input.replace(" ", ""); // "2.03445"

正規表現を使用して、スペース以外のものを置き換えることもできます。たとえば、数字でもピリオドでもないものをすべて取り除くには、次のようにします。

String input = "123,232 . 03 445 ";
input = input.replaceAll("[^\\d.]", ""); // "123232.03445"

これにより、数字以外のピリオド以外の文字が置き換えられるため、入力にそれらの文字のみが残ります。Pattern正規表現について少し学習するには、javadocs を参照するか、オンラインで利用可能な多くのチュートリアルのいずれかを検索してください。

編集:もう1つの発言String.trimは、文字列の最初と最後からすべての空白を削除して、次のように" 2.0332"します"2.0332"

String input = " 2.0332 ";
input = input.trim(); // "2.0332"

編集 2:あなたの更新により、問題が発生しました。Scanner.nextFloatスペースで壊れているものです。コードを変更して次のScanner.nextLineように使用する場合:

while (i <= 0) {
    String input = in.nextLine();
    input = input.replaceAll("[^\\d.]", "");
    float i = Float.parseFloat(input);

    if (i <= 0.0f) {
        System.out.println("Please enter a number greater than 0.");
    }

    System.out.println(i);        
}

そのコードは、などの入力を適切に受け入れます"123,232 . 03 445"。my の代わりに任意のソリューションを使用すると、replaceAll機能します。

Scanner.nextFloat空白に基づいて入力を自動的に分割します。Scanner構築時に区切り文字を使用できます (たとえば、、、、および でnew Scanner(System.in, ",./ ")区切ります)" デフォルトのコンストラクター は、空白に基づいて自動的に区切ります。,./new Scanner(System.in)

于 2012-09-24T18:05:42.420 に答える
1

メインメソッドの最初の引数を使用していると思います。メインメソッドが次のようになっている場合:

public static void main(String[] args){
  System.out.println(deleteSpaces(args[0]);
}

あなたの問題は、メインメソッドに渡される引数をスペースで区切ることです。したがって、次のようにクラスを実行します。

java MyNumberConverter 22.2 33

最初の引数 arg[0] は「22.2」で、2 番目の引数 [1] は「33」です。

しかし、他の人が示唆しているように、String.replaceはとにかくこれを行うためのより良い方法です。

于 2012-09-24T18:12:16.270 に答える