2016-04-15 19 views
1

このファイルは整数だけで埋められています。可能であれば、各整数を描くスペースがあるかもしれないし、そうでないかもしれないファイルを読むことができるようにしたいと思います。空白で区切られた、または区切られた可能性のあるファイルを読み取る

ここに2つの視覚的な例があります。

最初のものは、スペースで区切られていない整数と2番目のものです。

第1の例:

020030090 
000907000 
900208005 
004806500 
607000208 
003102900 
800605007 
000309000 
030020050 

第2の例:

0 3 8 0 12 0 15 16 6 0 4 0 0 0 0 0 
0 11 5 0 1 0 0 14 13 0 3 9 12 7 0 0 
0 0 0 0 6 0 0 0 0 12 0 14 0 0 0 16 
10 16 0 6 2 13 0 0 0 8 7 0 0 0 0 0 

3 10 1 0 13 0 0 15 0 9 0 16 5 0 0 0 
0 0 16 0 0 0 0 11 14 0 13 12 0 3 0 0 
4 0 7 8 0 0 12 9 0 0 0 0 0 0 11 0 
0 6 0 0 16 0 0 0 11 5 0 0 15 0 0 2 

11 0 0 12 0 0 8 2 0 0 0 1 0 0 14 0 
0 7 0 0 0 0 0 0 3 11 0 0 8 16 0 9 
0 0 13 0 3 6 0 7 16 0 0 0 0 11 0 0 
0 0 0 2 5 0 14 0 15 0 0 4 0 13 7 1 

0 0 0 0 0 14 5 0 0 0 16 2 13 0 8 10 
14 0 0 0 8 0 9 0 0 0 0 11 0 0 0 0 
0 0 6 15 7 1 0 3 12 0 0 13 0 2 5 0 
0 0 0 0 0 15 0 12 1 14 0 3 0 6 16 0 

注:

Iは、第2のファイルが線引きされていない可能性があることを追加したいと思います同じ金額でこれは、1つの整数がその後に1つのスペースを持ち、もう1つの整数がそれの後に10のスペースを持つことができることを意味します。

私が試してみました何:

を私は(「 """)でReplaceAllとの組み合わせでスプリット( "\ S +")を使用してみましたがが、これは第二では動作しませんこれは、より多くのスペースを持つため、split関数が機能しないためです。

私はreplaceAll( ""、 "")を使用してみましたが、空白が全くないようにしました。その後、文字列をchar配列に変換しましたが、これは1桁を超える整数の問題を示しました(2番目の例でもうまくいきません)。

コード:

public void initializeGrid(int grid[][], String fileName) throws FileNotFoundException, IOException 
{ 
     Scanner read = new Scanner(Paths.get(fileName)); 
     int value; 

     for (int i = 0; i < ROWS; i++) 
     {  
      String line = read.nextLine(); 
      String [] numbers = line.trim().split("\\s+"); 

      for (int j = 0; j < COLUMNS; j++) 
      {  
       value = Integer.parseInt(numbers[j]); 
       grid[i][j] = value; 
      } 
     } 
} 
+0

整数が区切られていない場合、どこが終了し、次のものが始まるかをどのように知っていますか? – dnault

+0

@dnault私は問題だと知っていますが、ユーザーがファイルのパスを入力すると、各整数がスペースで区切られていることをどのように知ることができますか?それが可能ならば、私は最初に言ったのです。この状況について心配するのはずっと簡単ですが、両方のファイルが有効なのでできない場合はこの状況に対処したいと思います。 –

+0

ああ、そうだ。最初の場合、各整数は '[0-9]'の範囲内にあることが保証されています。 2番目の場合は、整数が9より大きい場合に必要です。 – dnault

答えて

1

上記のコメントで@dnaultの勧告に続き、ここではJavaのCollectionフレームワークの代わりに、2D int配列を使用して実装です。この方法は、各行のListに必要な数のエントリが正確に含まれているという点で、2次元アレイよりも利点があります。配列を使用すると、行の値がCOLUMN未満の場合、配列には残りのすべての値が0になります。

public List<List<Integer>> readFile(String fileName) 
     throws FileNotFoundException, IOException { 
    BufferedReader br = Files.newBufferedReader(Paths.get(fileName)); 
    List<List<Integer>> values = new ArrayList<>(); 


    for(String line; (line = br.readLine()) != null;){ 
     String[] splitLine = line.trim().split("\\s+"); 

     if(splitLine.length < 2) 
      values.add(parseSingleDigitValues(splitLine[0].toCharArray())); 
     else 
      values.add(parseDelimitedValues(splitLine)); 

    } 

    return values; 
} 

private List<Integer> parseSingleDigitValues(char[] line) { 
    List<Integer> values = new ArrayList<>(); 
    for(char c: line){ 
     values.add(Integer.parseInt(String.valueOf(c))); 
    } 
    return values; 

} 

private List<Integer> parseDelimitedValues(String[] line) { 
    List<Integer> values = new ArrayList<>(); 
    for(String str :line) 
     values.add(Integer.parseInt(str)); 
    return values; 
} 

結果List<List<Integer>>、簡単に以下の方法使用して、2D int配列に変換することができます:あなたははっきりと、その後の負担をあなたのコード/ APIを文書化した場合に最終的には

private int[][] asArray(List<List<Integer>> lists){ 
    int s1 = lists.size(); 
    int s2 = 0; 
    for(List<Integer> sublist : lists){ 
     if(sublist.size() > s2) 
      s2 = sublist.size(); 
    } 

    int[][] arr = new int[s1][s2]; 
    for(int i = 0; i < lists.size(); i++){ 
     List<Integer> sublist = lists.get(i); 
     for(int j = 0; j < sublist.size(); j++){ 
      arr[i][j] = sublist.get(j); 
     } 
    } 
    return arr; 
} 

EDITを、それを適切に使用するためにユーザーが使用しています。私はあなたのAPIで簡単にすることをお勧めします:ユーザーにスペース区切りのファイルを提供する必要があることを伝えます。次に、区切り文字以外のファイルをスペース区切りのファイルに変換するユーティリティー・クラスを提供することができます。

+0

それはまさに私の心の中で考えていたものです。私は、ユーザーがスペースを入れずにファイルを入力して、正しく動作しないことを確認してもらうことを望んでいませんでしたが、スペースで区切られていなければならないと伝えていると思います。 –

+0

正確に。これがAPIのドキュメントがするべきことです---ユーザーにAPIの使い方を教えてください。それが明確に文書化されている限り、あなたのガイドラインに従うことはユーザーにあります。スペース区切り文字を必要とする場合は、スペースが使用されていない、または不適切な使用があった場合は例外をスローすることをお勧めします。これは、ユーザーがデバッグプロセスで可能な限り早期に問題を識別するのに役立ちます。 –

関連する問題