2016-09-01 4 views
1
import java.io.File; 
import java.util.ArrayList; 
import java.util.Scanner; 

public class NotWorking { 
    public static void main(String[] args) throws Exception{ 
     // The files that I need to open 
     // They contain integers (points on a graph) 
     // Ex: 74 0 80 100 150 60 150 
     String[] names = {"Test.txt", "Test2.in", "test3.in", "Test4.in", "Test5.in"}; 
     // Create 5 list 
     ArrayList<Integer>[] textFiles = new ArrayList[5]; 

     // for loop through each file 
     for (int i = 0; i < names.length; i++) { 
      Scanner scanner; 
      // open file 
      scanner = new Scanner(new File(names[i])); 
      // @fileNumber is one of 5 list 
      int fileNumber = 0; 
      // add each integer to the correct list 
      while (scanner.hasNextInt()){ 
      // line below this is where it says NullPointer Exception 
      textFiles[fileNumber].add(scanner.nextInt());  
      }enter code here 
      // Trying to see if lists are made correctly and also increasing fileNumber after 
      // each file is processed 
      System.out.println(textFiles[fileNumber]); 
      fileNumber ++;  
     } 
    } 
    } 

配列として指定されたファイル(.txtと.in)を開く必要があります。私はforループを使ってそれらをループしてから開きますが、それらを読んでいるうちに私はそれらのデータを使いたいと思います。だから私の考えは、5つの配列リストを作成し、その中にデータを入れることでした。しかし、私はそれを把握していないようです。それは私にNullPointer例外を与え続けます。また、私は別の方法にデータを置くことができる必要があります。例として「Quad(ax、ay、bx、by、cx、cy、dx、dy)」があり、各ファイルには必要な座標があります。配列リストはそれを達成するための最良の方法ですか?ファイルを読み込んで各ファイルの整数を配列リストに割り当てる方法は?

+0

あなたはarraylistsを格納するための配列を作成しました。あなたはまだ実際にarraylists *を作成していません。 –

+0

しかし、あなたは5つの配列リストを作成していません。あなたは配列リストを作成していません。あなたが作成したのは、配列リストの型の長さが5の空の配列です。 – azurefrog

答えて

0

メモリをarraylistsに割り当てる必要があります。

これは、textFiles [0]、...がnullの場合にNullPointerExceptionをスローした理由で、nullに対して操作を実行しようとしています。

textFiles[fileNumber] = new ArrayList<Integer>(); 
// call constructor as above to allocate memory to each individual arraylists. 
while (scanner.hasNextInt()){ 
     textFiles[fileNumber].add(scanner.nextInt());  
     } 
+0

完璧!ありがとう! – Trey

0

あなたのコードはとても低いレベルである - より有用な抽象化で動作するようにあなたにいくつかの「起点」を提供するつもり:

からすべての行を読むためにはるかに簡単であるかもしれないすべてのファイルシングルにList<String>(ただし、すべてのファイルが同じ形式を持つと仮定します)。

そして、これは宿題があり、あなたはすべてのこと、「手動」に頼まれていない限り、それは簡単にFiles.readAllLines()

で達成することができます。あなたは本当にそのような高レベルの抽象化に頼るべきです。すでに存在するものを実装することにはあまり意味がありません。このようにしない別の理由は、あなたが話しているのであれば巨大なファイルです。そのため、メモリ内のすべての行を同じ時点にしたいだけです。

また、readAllLinesを使用して1回のショットですべてのファイルを読み取らなくても、もう1つのファイルを読み取ってからワンショットでこのメソッドを使用することができます。

あなたの情報をどのように収集しても、生データを含むList<String>があります。今すぐregular expressionsを使用して、それらの文字列の数字を簡単に一致させることができます。 Integer.parseInt()を使用してintに変換します。簡単な例:最後に

String numbersAsString = "1 2 3 4"; 
String[] separatedNumbers = numbersAsString.split(" "); 
List<Integer> numbers = new ArrayList<>(); 
for (String oneNumber : separatedNumbers) { 
    numbers.add(Integer.parseInt(oneNumber)); 
} 

そして、他のいくつかの文字列表現に4つのint型または整数を「変換」は本当に簡単です。 like:

String toQuad(int a, int b, .......) { 
    return "Quad(" + a +"," + b ... 
+0

これらはすべて同じ形式ですが、整数を含みます。私はJavaに慣れていないので、これは疑わしい質問かもしれませんが、すべてのファイルにグラフ上の点が含まれています。だから彼らは整数である必要があります。 List の代わりにList を実行するだけですか?また、リストからデータを抽出すると、メソッドで使用できるようになりますか? – Trey

+0

これはすでに私の更新された答えです。いいえ、リストタイプを変更しても、文字列を数字に魔法に変換することはありません。あなたはそのためのコードを書く必要があります。 – GhostCat

関連する問題