0

私はJavaを学んでいて、ファイルからの読み取りに関して質問があります。文字列を含むファイルから数値のみを読み取りたいです。これが私のファイルの例です:

66.56
"3
JAVA
3-43
5-42
2.1
1

これが私のコーディングです: public class test {

public static void main (String [] args){
      if (0 < args.length) {
     File x = new File(args[0]);
    try{     
Scanner in = new Scanner( new FileInputStream(x));
ArrayList<Double> test = new ArrayList<>();
while(in.hasNext()){ 
    if(in.hasNextDouble()){
      Double f=in.nextDouble(); 
      test.add(f);}
    else 
            {in.next();}
}
 catch(IOException e) { System.err.println("Exception during reading: " + e); }
}

私の問題は、66.56,2.1 と 1 のみを追加することです。"3 の後に 3 を追加しないか、3-43 と 5-42 を無視します。文字列をスキップして、ここに double のみを追加する方法を教えてもらえますか?

4

2 に答える 2

0

カスタム タイプ センサー ユーティリティ クラスを記述して、オブジェクトを整数に変換できるかどうかを確認できます。私はこの問題にこのようにアプローチします。

さらに、これらのシナリオを処理するために2.1" 3などの値があることがわかります。 isDoubleType()isLongType()などの追加のメソッドを記述します。

また、この問題を解決するには、いくつかのカスタム ロジックを作成する必要があります。

public class TypeSensor {
public String inferType(String value) throws NullValueException {
        int formatIndex = -1;

        if (null == value) {
            throw new NullValueException("Value provided for type inference was null");
        }else if (this.isIntegerType(value)) {
            return "Integer";
        }else{
            LOGGER.info("Value " + value + " doesnt fit to any predefined types. Defaulting to String.");
            return "String";
        }
    }
}

private boolean isIntegerType(String value) {
        boolean isParseable = false;
        try {
            Integer.parseInt(value);
            LOGGER.info("Parsing successful for " + value + " to Integer.");
            isParseable = true;
        } catch (NumberFormatException e) {
            LOGGER.error("Value " + value + " doesn't seem to be of type Integer. This is not fatal. Exception message is->" 
                                                + e.getMessage());
        }
        return isParseable;
    }
}
于 2013-10-06T14:10:17.340 に答える
0

上記の 3 つすべて。「3、3-43、4-42は文字列

文字列を読み取って分割し、"-で数値をチェックするか、文字と整数の間にスペースを入れます。コンパイル後の JVM は、double に変換できない場合、すべてを文字列として扱います。そしてファイル リーダー少なくともスペースまたは改行まで読み取りを停止しないため、上記のようにしない限り、コードは意図したとおりに機能しません。

解決策 1:
入力ファイルを次のように変更します。

66.56
" 3
JAVA
3 - 43
5 - 42
2.1
1

解決策 2:
入力ファイルの非常に変化しやすい性質を考慮して、現在の入力に対してのみ作成された解決策を投稿しています。入力が変更された場合、より用途の広いアルゴリズムを実装する必要があります。

public static void main(String[] args) {
        File x = new File(args[0]);
        try {
            Scanner in = new Scanner(new FileInputStream(x));
            ArrayList<Double> test = new ArrayList<>();
            while (in.hasNext()) {
                if (in.hasNextDouble()) {
                    Double f = in.nextDouble();
                    test.add(f);
                } else {
                    String s=in.next();
                    if(s.contains("\"")){
                        String splits[]=s.split("\"");
                        test.add(Double.parseDouble(splits[1]));
                    }
                    else if (s.contains("-")){
                        String splits[]=s.split("-");
                        test.add(Double.parseDouble(splits[0]));
                        test.add(Double.parseDouble(splits[1]));
                    }
                }
            }
            System.out.println(test);
        } catch (IOException e) {
            System.err.println("Exception during reading: " + e);
        }
}
于 2013-10-06T13:36:28.457 に答える