2016-11-18 4 views
1

誰かが私が間違ってやっていることを理解するのに役立つでしょうか? 各行に11個の整数と倍数のファイルを読み込む必要があります。各行は独自のオブジェクトになり、arrayListに格納する必要があります。ただし、デリミタは単一のスペースです。そして私はこのコードを使用しましたが、それはうまくいかず、私は何が間違っているのか分かりません。空白を区切り文字として使用するファイルを解析する-java。 (私はそれを理解していません)

package p2_0000000; 

import java.util.Scanner; 
import java.io.*; 
import java.util.ArrayList; 
import java.util.Arrays; 


public class P2_000000 { 


    public static void main(String[] args) { 
     // TODO code application logic here 
     System.out.println("Which file year would you like to analyze:\n" 
       + "1) 2007\n" 
       + "2) 2011\n" 
       + "3) 2013\n" 
       + "(Enter number for choice)"); 
     Scanner input = new Scanner(System.in); 
     int choice = input.nextInt(); 
     ArrayList<dwellingClass> alist = new ArrayList<dwellingClass>(); 
     if (choice == 1) { 
      try { 
       File file = new File("2007.txt"); 
       Scanner scanner = new Scanner(file); 


       while (scanner.hasNextLine()) { 
        String line = scanner.nextLine(); 
        String[] info = line.split(" "); 

        int age = Integer.parseInt(info[0]); 
        int region = Integer.parseInt(info[1]); 
        double lmed = Double.parseDouble(info[2]); 
        double fmr = Double.parseDouble(info[3]); 
        double extremelyLowIncome = Double.parseDouble(info[4]); 
        double veryLowIncome = Double.parseDouble(info[5]); 
        double lowIncome = Double.parseDouble(info[6]); 
        int bedrooms = Integer.parseInt(info[7]); 
        double value = Double.parseDouble(info[8]); 
        int rooms = Integer.parseInt(info[9]); 
        double utility = Double.parseDouble(info[10]); 

        dwellingClass dwelling = new dwellingClass(age, region, lmed, fmr, extremelyLowIncome, veryLowIncome, lowIncome, bedrooms, value, rooms, utility); 
        alist.add(dwelling); 

       } 
       scanner.close(); 

      } catch (Exception a) { 
       a.printStackTrace(); 
       System.exit(0); 
      }; 
      for (dwellingClass each : alist) { 
       System.out.println(each); 
      } 

     } 

     System.out.println(alist.get(0).getAge()); 
    } 
} 

私はこれらのエラーを取得:

java.lang.NumberFormatException: For input string: "" 
    at  java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:592) 
    at java.lang.Integer.parseInt(Integer.java:615) 

はあなたの助けをみんなありがとう! 私はまた、これも後でこの記事を読み、誰のために働くことができることを考え出し:

あなたはあなたのファイルをロードしないで、新しいファイルを作成している
public class P2_0000000 { 

    public static void main(String[] args) { 
     // TODO code application logic here 
     ArrayList<dwellingClass> alist = new ArrayList<dwellingClass>(); 
     try { 
      File file = new File("2007.txt"); 
      Scanner input = new Scanner(file); 

      while (input.hasNext()) { 

       int age = input.nextInt(); 
       int region = input.nextInt(); 
       double lmed = input.nextDouble(); 
       double fmr = input.nextDouble(); 
       double extremelyLowIncome = input.nextDouble(); 
       double veryLowIncome = input.nextDouble(); 
       double lowIncome = input.nextDouble(); 
       int bedrooms = input.nextInt(); 
       double value = input.nextDouble(); 
       int rooms = input.nextInt(); 
       double utility = input.nextDouble(); 

       dwellingClass dwelling = new dwellingClass(age, region, lmed, fmr, extremelyLowIncome, veryLowIncome, lowIncome, bedrooms, value, rooms, utility); 
       alist.add(dwelling); 

      } 
      input.close(); 

     } catch (Exception a) { 
      a.printStackTrace(); 
      System.exit(0); 
     }; 
     for (dwellingClass each : alist) { 
      System.out.println(each.getAge() + each.getRegion()); 
     } 
     System.out.println(alist.get(0).getAge()); 
    } 
} 
+0

また、最後の行(getAge)を印刷できませんでした。 – Roxas2015

+1

'parseInt'が文字列値を整数に解析できないときに' NumberFormatException'が返されます。だから、正しい順序で整数と倍数を読んでいることを確認するためには、データを見る必要があります。この問題をデバッグするには、 'String'配列' info'の各値を出力して、それが期待どおりであることを確認することができます。 –

+1

エラーが発生した入力ファイルを含めることはできますか? –

答えて

0

。ファイルをロードするには、ファイル入力ストリームを使用する必要があります。お使いのスキャナは文句を言わない私は修正立って、新しいファイルには何もので、そのすべてのNull


を見つけ、構文が正しく、これは既存のファイルをロードします。他の人がそのデータの問題

+0

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.htmlによると、これはスキャナーの有効な使用方法です。 'Scanner sc = new Scanner(new File(" myNumbers "));' –

+0

非常に直観的で直感的ですが、大丈夫でしょうかと思います –

+0

Pritamと同様に、空白のために失敗する可能性があります。その理由は、通常のエディタでファイルを確認し、空白の後にタブが付きます –

1

まず上に述べたように、あなたは、ファイルをこのように読むことができます:

Scanner in = new Scanner(new FileReader("2007.txt")); 

第二に、あなたがこのようなものを使用する必要があります空白解析する:

yourString.split("\\s+"); 

をこの行は次のようになります:

String[] info = line.split("\\s+"); 

Stringあなたがやったやり方。

しかし正しい値、つまりそれぞれのメソッドに正しいタイプを渡していることを確認してください。それ以外の場合は、取得しているエラーが発生します。

+0

デリミタあなたのパターンは複数のスペースに一致しますが、単一のスペースです。 –

+1

また、 'new Scanner(new File(" 2007.txt "))'を使ってファイルを読むこともできます。これは質問コードがしていることです。そのポイントは何ですか? ---「区切り文字は空白ではなく**区切り記号**」であるので、 'line.split(" ")'を 'split(" \\ s + ")'に変更するとno差。 ---それで、あなたの答えの最後の文だけが実際に有用なものを言っているようです。 – Andreas

1

ファイルから読み込んだ文字列の数値検証を行い、dwellingClassオブジェクトを構築するための要件と一致することを確認する必要があります。

String line = scanner.nextLine(); 
String[] info = line.split("\\s+"); 
boolean validInput = true; 
//loop through your info array and check each number is valid beforehand 
for(int i = 0; i < info.length; i++) 
{ 
    if(!info[i].matches("\\d")) 
    { 
     validInput = false; 
     break; 
    } 
} 

//now we want to make sure our input was valid or else we don't create the object 
if(info.length == 11 && validInput == true) 
{ 
    dwellingClass dwelling = new dwellingClass(
     Integer.parseInt(info[0]), 
     Integer.parseInt(info[1]), 
     Double.parseDouble(info[2]), 
     Double.parseDouble(info[3]), 
     Double.parseDouble(info[4]), 
     Double.parseDouble(info[5]), 
     Double.parseDouble(info[6]), 
     Integer.parseInt(info[7]), 
     Double.parseDouble(info[8]), 
     Integer.parseInt(info[9]), 
     Double.parseDouble(info[4])); 
    alist.add(dwelling); 
} 

あなたはwhileループ内でこれを置く場合は、それが唯一のラインでオブジェクトを作成するには数字のみを含むファイルから読み取られ、11桁の数字が含まれ、他の行は無視されます。これにより、行が正しくフォーマットされていなくてもファイルの実行が可能になります。

関連する問題