3

Groovy または Java で書式設定された文字列から単一の属性を読み取る良い方法があるかどうか疑問に思っています。

スペースで区切られたいくつかの属性を含む文字列があります。たとえば、「2.1 20 何かが真実」。順序は固定されており、「属性タイプ」は既知です (たとえば、最初は Float、2 番目は Integer など)。String.format() に似たものが必要ですが、逆です。

文字列を手動で分割して値を読み取ることができることはわかっていますが、これによりコードが次のように複雑になりすぎます。

String[] parsedText = "2.1 20 Something true".split(delimiter)

try {
   firstVal = new Float(parsedText[0])
}
catch (NumberFormatException e) {
   throw new RuntimeException("Bad data [0th position in data string], cannot read[{$parsedData[0]}], cannot convert to float")
}
...

より良い方法はありますか?少なくともGroovyでは:-)

ありがとう!

4

2 に答える 2

11

Java Scannernext()クラスには、文字列の次の部分 ( 、nextInt()nextDouble()など) を取得して解析するためのメソッドが多数あります。

コードは次のようになります。

String input = "2.1 20 Something true";
Scanner s = new Scanner(input);
float f = s.nextFloat();
int i = s.nextInt();
String str = s.next(); // next() doesn't parse, you automatically get a string
boolean b = s.nextBoolean();

注意すべき唯一のこと:両方とも文字列をnext()取得しますが、次のスペースまでの文字列のみを取得します。文字列コンポーネントにスペースを入れたい場合は、それを考慮する必要があります。nextLine()next()

于 2012-09-04T09:56:19.283 に答える
2

java.util の Scanner クラスがその仕事をしてくれるはずです。入力から読み取る場合、考慮に入れる必要があるケースは他にもたくさんあります。

あなたの場合、スキャナーメソッドを連続して呼び出すか、正規表現を使用して「フォーマット文字列」を明示的に定義し、それを一箇所にまとめておくことができます。このようにして、すぐに検証を行うことでメリットが得られます。

//calling methods in row
{
    Scanner sc = new Scanner("2.1 20 Something true");
    float f = sc.nextFloat();
    int i = sc.nextInt();
    String s = sc.nextLine();

    System.out.print(String.format("%s\t%.2f\t%x\n", s, f, i));

    sc.close();
}
//using regexp
{
    Scanner sc = new Scanner("2.1 20 Something true");
    sc.findInLine("(\\d+[\\.,]?\\d*)\\s(\\d+)(\\s.*)$");
    MatchResult result = sc.match();
    float f = Float.parseFloat(result.group(1));
    int i = Integer.parseInt(result.group(2));
    String s = result.group(3);

    System.out.print(String.format("%s\t%.2f\t%x\n", s, f, i));

    sc.close();
}

Scanner クラスには、タイプのオブジェクトでクラスを使用するためのさまざまなコンストラクターがあります。

このクラスはロケールに対応しているため、システム設定によって異なる動作をする可能性があることに注意してください (一部の国では、浮動小数点の代わりにコンマを使用するなど...)。ロケール設定をオーバーライドできます。

ここに包括的なリファレンスがあります: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

于 2012-09-04T10:50:57.000 に答える