0

日付を読み取り、日付範囲と無効な日付を表示する日付プログラムを実行しています。開始するには、一度に 1 行ずつ読み込んで、希望どおりに行をフォーマットします。ただし、読み取った文字列行から月、日、年を取得して、操作できる個別の変数にすることも必要です。読み込んだデータは次のようになります。

    June 17, 1997
    July 23, 1997
    September 28, 1980
    September 31, 1980
    Mar. 2, 1980
    Apr. 2, 1980
    May 3, 1980
    Nov 25, 1989
    Dec 25, 1989
    Jan 3, 1973

これまでのコードのスニペットは次のようになります

  Scanner in = null;
    try {
        in = new Scanner(new File("dates.txt"));
    } catch (FileNotFoundException exception) {
        System.err.println("failed to open dates.txt");
        System.exit(1);
    }
    while (in.hasNextLine()) {
        String line = in.nextLine();
        line = line.replace(".", "");
        line = line.replace(",", "");
    }

だから私の質問は、どのように行変数を「スキャン」し、それを月、日、年の異なるトークン/変数に分けることができるかということです。または、行全体をスキャンする代わりに、最初に文字列トークンをスキャンし、それらを必要なものに変更して (コンマとピリオドを取り除く)、int に解析することはできますか? それが可能であれば、それを int に解析する操作は何ですか?

4

2 に答える 2

1

猫の皮を剥ぐ方法は複数あります。

正規表現を使用できます

String[] strings = new String[3];

Pattern p = Pattern.compile("(\\w+) (\\d+), (\\d+)");
Matcher m = p.matcher(inputString);
if(m.matches()) {
   for(int i=0;i<3;i++) {
      strings[i] = m.group(i+1);
   }
}

このための最も便利なツールは、Java オンライン正規表現チェッカーです。

別のアプローチを取ることもできます: 行全体を読み取ってからフィールドに分割する代わりに、Scannerの適切なメソッドを使用してフィールドを 1 つずつ読み取ってみることができます。

パブリック文字列next()

このスキャナーから次の完全なトークンを検索して返します。完全なトークンの前後には、区切り文字パターンに一致する入力が続きます。以前の hasNext() の呼び出しで true が返された場合でも、このメソッドは入力がスキャンされるのを待っている間にブロックされる場合があります。

public int nextInt(整数基数)

入力の次のトークンを int としてスキャンします。以下で説明するように、次のトークンを有効な int 値に変換できない場合、このメソッドは InputMismatchException をスローします。変換が成功すると、スキャナは一致した入力を超えて進みます。次のトークンが上で定義した整数正規表現に一致する場合、トークンは int 値に変換され、ロケール固有のプレフィックス、グループ セパレータ、およびロケール固有のサフィックスがすべて削除され、Character.digit を介して非 ASCII 数字が ASCII 数字にマッピングされます。 、ロケール固有の負の接頭辞と接尾辞が存在する場合は負号 (-) を先頭に追加し、結果の文字列を指定された基数で Integer.parseInt に渡します。

または、SimpleDateFormatを使用して、さまざまな形式を処理できます

SimpleDateFormat format1 = new SimpleDateFormat("MMMMM d, yyyy");
SimpleDateFormat format2 = new SimpleDateFormat("MMM. d, yyyy");
于 2013-09-23T22:36:41.580 に答える
1

このようなものを使用できます..

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.StringTokenizer;

public class ParseFileName {
  public static void main(String[] args) throws IOException {
    Scanner in = null;
    try {
      in = new Scanner(new File("dates.txt"));
    } catch (FileNotFoundException exception) {
      System.err.println("failed to open dates.txt");
      System.exit(1);
    }
    while (in.hasNextLine()) {
      String line = in.nextLine();
      line = line.replace(".", "");
      line = line.replace(",", "");

      StringTokenizer st = new StringTokenizer(line);
      String strMonth = st.nextToken();
      String strDay = st.nextToken();
      String strYear = st.nextToken();

      Integer day = Integer.parseInt(strDay);
      Integer year = Integer.parseInt(strYear);
      //...
    }
  }

}

ここで、行が常にそのようになっていることを確認する必要があります。そうしないと、nextToken に検証が必要になります.. hasMoreTokens メソッドを使用するようなものです。月の整数を取得する必要がある場合は、マッピング メソッドを記述することもできます。

于 2013-09-23T22:34:56.843 に答える