テキストファイルがあり、行を読んでいるテキストファイルの種類を見つける必要があります。たとえば、次のようなテキストファイルがあります。
1
test
3.123123
13/21/13
このタイプをどのように区別できますか?Javaでコンソールの文字列、整数、日付、または浮動小数点数を記述する必要があります
正規表現を使用できます。たとえば、すべての数字(またはマイナス/プラス記号の後に数字が続く)の場合、それはintです。タイプごとに正規表現を用意して、次々に試してください。intでない場合は、floatかどうかを確認してください。フロートでない場合は、日付かどうかを確認してください。等々。すべてのチェックが失敗した場合、それは文字列です。
ランダムに解析を試み、例外をスローしないものを調べるというブルートフォースアプローチを試すこともできますが、それは良い考えではありません。
魔法の解決策はありません。入力を行ごとに解析および分析する必要があります。
整数を区別するには、次を使用できます
Integer.parseInt(s)
また、ParsingExceptionがスローされない限り、データは整数であると想定します。ダブルについても同じです。日付はさまざまな形式で表示される可能性があるため、日付はおそらく問題です。
あなたの場合、コードを単純化するために、パターンを使用する方が良いと思います。
Pattern[] patterns = Pattern[] {Pattern.compile("^\\d+$"), Pattern.compile("^\\d+\\.\\d*$"), Pattern.compile("^\\d{1,2}/\\d{1,2}/\\d{1,2}$")};
Class<?> types = new Class[] {Integer.class, Double.class, Date.class};
for (int i - 0; i < patterns.length; i++) {
if (patterns[i].matches(str)) {
return types[i];
}
}
return null;
完璧なソリューションを実装する場合は、テキストファイルに表示される可能性のあるすべてのデータ型を定義する文法を使用するパーサーを作成する必要があります。複雑なデータ型を照合したくない場合は、正規表現の照合でも役立ちます。
あなたが求めていることを完璧に行うことは不可能です。たとえば3.123123
、質問にはString、float、またはdoubleを含めることができます。
ダブルからダブルのように見えるすべてのもの、ロングからロングのように見える他のすべて、ブール値からブール値のように見える他のすべて、日付から日付のように見える他のすべて、およびすべてを変換することができますそれ以外の場合は文字列に。これを行うには、BufferedReader.readLineまたはScanner.next(スペース、タブなど、および改行を分割するため)を使用して次のものを読み取り、次にLong.parseLongなどの静的メソッドをtry...catchで使用します。解析エラーを検出するためのブロック(つまり、長く見えない場合)。例:
String thing = bufferedReader.readLine();
long longValue;
boolean looksLikeALong = false;
try {
longValue = Long.parseLong(thing);
looksLikeALong = true;
} catch (NumberFormatException e) {}
あなたがこれまでに何を試したか、何がうまくいかなかったか、あなたの思考プロセスはどうだったかを見たいです。
あまり考えずにこれを解決する方法はいくつかあります。そのうちのいくつかは、正規表現を使用しているか、instanceofを使用しているか、いくつかの解析メソッドparseInt、parseLongなどを使用しています。