1

私はあなたが一行で日付を入力しなければならないJavaプログラミングの割り当てを持っています、そしてそれはあなたに日付に基づいた数秘術(星占いのような)レポートを与えます。ユーザーは、スペースで区切ってフォーマットされた日付を入力することを前提としています。

in.nextInt()を使用して、入力の月、日、および年を取得できます。ただし、ユーザーが日付の各部分に正しい区切り文字を使用していることも確認する必要があります。つまり、ユーザーがスラッシュを使用しているかどうかを確認する必要があります。

以下のコードを見ると、現在、charAt()を使用して区切り文字を検索しています。問題は、日付が常に14文字になるとは限らないことです。したがって、2004年10月17日の形式の日付は14文字の長さですが、1992年4月7日の日付は12文字の長さしかないため、「slash1」は常にin.charAt(3)に含まれるとは限りません。後者の状況では、in.charAt(2)になります。

javaにはin.nextChar()のようなものを許可するメソッドがありますか?そうではないことは知っていますが、どうすれば日付の次の文字を見つけることができますか?

編集:私はこれを元々反映するのを忘れていましたが、私の教授は、何らかの理由でString.split()メソッドを使用することは許可されていないと言いました。問題は、月、日、年が完全にうまくいくということです。その人が日付を区切るためにスラッシュを使用したことを確認する必要があります。ダッシュを入力すると、日付は無効になります。

public void getDate()
{
    char slash1, slash2;

    do
    {
        System.out.print("Please enter your birth date (mm / dd / yyyy): ");
        Scanner in = new Scanner(System.in);
        String date = in.nextLine();

        month = in.nextInt();
        day = in.nextInt();
        year = in.nextInt();

        slash1 = date.charAt(3);
        slash2 = date.charAt(8);
    } while (validDate(slash1, slash2) == false);

    calcNum();
}
4

5 に答える 5

1

入力日付文字列を で分割すると" / "、文字列配列が得られます。次のステップは、その配列内の各文字列を int に変換することです。

于 2012-12-07T23:32:30.477 に答える
0

ストリームを先読みして、期待するものが含まれていることを確認します。

private static final Pattern SLASH = Pattern.compile("\\s*/\\s*");

static SomeTypeYouMadeToHoldCalendarDate getDate() {
  while (true) { /* Might want to give user a way to quit. */
    String line = 
      System.console().readLine("Please enter your birth date (mm / dd / yyyy): ");
    Scanner in = new Scanner(line);
    if (!in.hasNextInt())
      continue;
    int month = in.nextInt();
    if (!in.hasNext(SLASH)
      continue;
    in.next(SLASH);
    ...
    if (!validDate(month, day, year))
      continue;
    return new SomeTypeYouMadeToHoldCalendarDate(month, day, year);
  }
}
于 2012-12-08T00:17:55.533 に答える
0

線を取得するためだけに Scanner を使用します。次に、空白の行を split() し、フィールドを確認します。

import java.util.Scanner;
import java.util.regex.Pattern;

public class GetDate {

   int month, day, year;

   public static void main(String[] args)
   {
      GetDate theApp = new GetDate();
      theApp.getDate();

   }

   public void getDate()
   {
      String date;
      do
      {
         System.out.print("Please enter your birth date (mm / dd / yyyy): ");
         Scanner in = new Scanner(System.in);
         date = in.nextLine();
      } while (validDate(date) == false);


      calcNum();
   }

   boolean validDate(String date)
   {
      // split the string based on white space
      String [] fields = date.split("\\s");

      // must have five fields
      if ( fields.length != 5 )
      {
         return false;
      }

      // must have '/' separators
      if ( ! ( fields[1].equals("/") && fields[3].equals("/") ) )
         return false;

      // must have integer strings
      if ( ! ( Pattern.matches("^\\d*$", fields[0]) && 
               Pattern.matches("^\\d*$", fields[2]) &&
               Pattern.matches("^\\d*$", fields[4]) ) )
         return false;

      // data was good, convert strings to integer 
      // should also check for integer within range at this point
      month = Integer.parseInt(fields[0]);
      day = Integer.parseInt(fields[2]);
      year = Integer.parseInt(fields[4]);

      return true;
   }

   void calcNum() {}
}
于 2012-12-08T00:36:04.227 に答える
0

これは Scanner メソッドを使用して以下を解析します。

import java.util.Scanner;
import java.util.InputMismatchException;

public class TestScanner {

   int month, day, year;
   public static void main(String[] args)
   {
      TestScanner theApp = new TestScanner();   
      theApp.getDate();
      theApp.calcNum();
   }

   public void getDate()
   {
      int fields = 0;
      String delim1 = "";
      String delim2 = "";
      Scanner in = new Scanner(System.in);

      do
      {
         fields = 0;
         System.out.print("Please enter your birth date (mm / dd / yyyy): ");
         while ( fields < 5 && in.hasNext() )
         {
            try {
               fields++;
               switch (fields)
               {
                  case 1:
                     month = in.nextInt();
                     break;
                  case 3:
                     day = in.nextInt();
                     break;
                  case 5:
                     year = in.nextInt();
                     break;
                  case 2:
                     delim1 = in.next();
                     break;
                  case 4:
                     delim2 = in.next();
                     break;
               }
            }
            catch (InputMismatchException e)
            {
               System.out.println("ERROR: Field " + fields + " must be an integer");
               String temp = in.nextLine();
               fields = 6;
               break;
            }
         }
      } while ( fields != 5 || validDate(delim1, delim2) == false);
      in.close();
      System.out.println("Input date: " + month + "/" + day + "/" + year);
   }   

   boolean validDate(String delim1, String delim2)
   {
      if ( ( !  delim1.equals("/") ) || ( ! delim2.equals("/") ) ) 
      {
         System.out.println("ERROR: use '/' as the date delimiter");
         return false;
      }
      if ( month < 1 || month > 12 )  
      {
         System.out.println("Invalid month value: " + month);
         return false;
      }
      if (  day < 1 || day > 31 ) 
      {
         System.out.println("Invalid day value: " + day);
         return false;  
      }
      if (  year < 1 || year > 3000 ) 
      {
         System.out.println("Invalid year: " + year);
         return false;  
      }
      return true;
   }

   void calcNum()
   {

   }

}
于 2012-12-08T07:56:39.100 に答える
0

どの文字がセパレーターとして使用されているかを考えるのではなく、必要なコンテンツである数字に注目してください。

このコードは数字以外で分割されます。各グループに含まれる数字の数や区切り文字として使用される文字は関係ありません。

String[] parts = input.split("\\D+");

また、ほとんどコードではないため、バグが発生する可能性ははるかに低くなります。

String[] に数値部分があるので、計算に取り掛かることができます。

上記の分割に続いて使用できるコードを次に示します。

if (parts.length != 3) {
    // bad input
}

// assuming date entered in standard format of dd/mm/yyyy
// and not in retarded American format, but it's up to you
int day = Integer.parseInt(parts[0];
int month = Integer.parseInt(parts[1];
int year = Integer.parseInt(parts[2];
于 2012-12-07T23:59:40.817 に答える