2017-03-31 1 views
0

私が読んでいるCSVファイルがあります。私は、6つのフィールドを初期化するための6つの引数と、必要な形式に文字列を変換するpublic stringメソッドを持つコンストラクタを作成しました。Javaファイルを読み込んで、対応する行ごとにオブジェクトを作成します。

public Hill(int number, String name, String countyName, double height, double latitude, double longitude) { 
    this.number = number; 
    this.name = name; 
    this.countyName = countyName; 
    this.height = height; 
    this.latitude = latitude; 
    this.longitude = longitude; 
} 

今、私が達成しようとしている何が、それは項目のリストを返すために、対応するオブジェクトを作成し、ファイルを開いて、それを読んだ後です。

私は私は私が右のそれをやっていた場合、私はわからなかったので、単純に新しいオブジェクトを作成しようとした行をコメントアウトしているpublic static List<Hill> readHills()

のinital方法与えられたので、私はちょうどプリントアウト私のコードが何をしているかを調べるためのテストとして、新しいオブジェクト行が冗長であるように見えます。 は、現在、私のコードは次のとおりです。私はサンプル値を置くが、技術的には、私は、新しいオブジェクトの6つの分野は、私が読んファイルからにしたいオブジェクトを作成するコードで

public static List<Hill> readHills() { 
    Scanner fileName = null; 
    try { 
     fileName = new Scanner(new File("C:/Users/TOSHIBA/Desktop/hills.csv")); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    Scanner finalFileName = fileName; 
    List<Hill> list = new ArrayList<Hill>() { 
     { 
       for(int i = 0; i < 21; i++) { 
        String line = finalFileName.nextLine(); 
        String[] splitted = line.split(","); 
        //add(new Hill(1, "", "", 100, 100, 100)); 
        System.out.println(Arrays.toString(splitted)); 
       } 

      } 
    }; 
    return list; 
} 

。フィールド名を追加しようとすると、私は赤い線であると言っていますNon static method cannot be referenced from a static method

どこが間違っていますか?なぜ私のコード行は役に立たないのですか?

私はコードを使って遊ぶことを続けましたが、どこにも行かない、私の問題は私が与えられたメソッド名を理解していないと思います。すなわち、なぜ、public static List<Hill> readHills()は何をしますか?

私はHill newHill = new Hill(int number, String name, String countyName,double height, double latitude, double longitude);を使用してみましたが、私はまず第一に、静的な文脈から

+0

http://stackoverflow.com/questions/2559527/non-static-variable-cannot-be-referenced-from-a-static-context – TmTron

答えて

1

を非静的フィールドを参照傾けることができないので:これはここ

List<Hill> list = new ArrayList<Hill>() { 

有効な構文ですが、全くありませんあなたが望むもの。

だけのために行く:代わりに

List<Hill> list = new ArrayList<>(); 

。あなたがやっていることは、匿名の内部クラスを作成します。それはここでは全く必要ありません。代わりにあなたが見る多くの問題につながっています。その後

:あなたは正しいタイプにあなたの文字列を有効にする必要があります。

String[] splitted = line.split(","); 

はあなたにのStringオブジェクトの配列を提供します。それらを変換する必要があります。あなたはそれに応じて、コンストラクタに渡すことができるように(あなたのコンストラクタは、最初のパラメータとしてint型値ではなく、例えば文字列を期待!)ように

Hill hill = new Hill(Integer.parseInt(splitted[0]), splitted[1], ... 

とを。

そして、あなたは実行します。

list.add(hill); 

しかし、トリッキーな部分は次のようになります。そのようが「正しい」の入力に依存して解析します。だから、あらゆる種類のエラー処理の準備をする必要があります。

それ以上:これは宿題でない限りではなく、は独自のCSVパーサーを実装します。既存のライブラリを使用してください(アイディアはhereを参照)。あなたは見る:正しい CSVの構文解析は、この形式のすべての微妙なクォークで動作しますではなく、簡単です。この作業には数時間を簡単に費やすことができます。あなたが使っている次のCSVファイルに、あなた自身のパーサーを壊す別の(有効な)バリエーションのCSV入力が含まれていることがわかります。 (信じて、私はそこにいた)

最後に、もしそのようなことがすでにあなたに負担をかけていたら、本当のテイクアウトは、あなたがまだそこにいるのではないということを受け入れる。あとずさりする;学習モードに戻り、基本的なJavaのすべてのことを理解してください。

+0

私は参照していますが、私は 'List list = new ArrayList (){'私のリストは初期化されていません。だから私は別の形式で自分のコードを書き直す必要がありますか?私のリストは初期化されていますが、私はしたでしょうから。 –

+0

私の更新を見る;私はちょうどあなたがあなたの問題の大部分を引き起こすあなたのコードの*全体*構文ミスを持っていることに気づいた。 – GhostCat

+0

はい、そして別のdownvote。話してください。私はなぜこの答えがdownvoteに値すると思うか分かりません。 – GhostCat

関連する問題