2016-07-27 6 views
2

私はこのような位置を含むテキストファイル、を有する:特定のcharをjavaのファイルから特定のcharに読み込む方法は?

enter image description here

#Pは、x、y座標を示し、これ#P行後の最初の*は(6 -1)であると。テキストファイルをブロック(1ブロックは#pから次の#p行まで)として読みたいと思います。

try { 
     File file = new File("filename.txt"); 
     FileReader fileReader = new FileReader(file); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     StringBuffer stringBuffer = new StringBuffer(); 
     String line; 
     while ((line = bufferedReader.readLine()) != null) { 
      stringBuffer.append(line); 
      stringBuffer.append("\n"); 
      if (line.startsWith("#P")){ 
       Scanner s = new Scanner(line).useDelimiter(" "); 
       List<String> myList = new ArrayList<String>(); 
       while (s.hasNext()) { 
        myList.add(s.next()); 
       } 
       for (int i=0; i<myList.size(); i++){ 
        System.out.println(myList.get(i)); 
       } 
       System.out.println("xy: "+myList.get(1)+", "+myList.get(2)); 
      } 
     fileReader.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

座標を2次元配列に保存したいが、別の問題が生じる。 -1、-1などはどうやって保存できますか? Javaで

+0

座標の最小値はどのような値になりますか?そうであれば、すべてを正の定数でオフセットできます。 –

+0

なぜ2次元?ポイントが存在する場合、coor [x] [y] == trueにしますか? –

+0

これは人生の実装のゲームで、私の考えは0と1の値を持つ2つの配列を持つことです.1つは現在の状態用で、もう1つは次の状態にします。それで、なぜ私はテキストファイルから2次元配列を作りたいのですか? – kaprip

答えて

0

これはあなたの問題を完全に解決するものではありませんが、マップの各ブロックを格納するためにマップを使用します。のペアがキーです。テキストは値です。

Map<String, String> contentMap = new HashMap<>(); 
String currKey = null; 
StringBuffer buffer = new StringBuffer(); 

while ((line = bufferedReader.readLine()) != null) { 
    if (line.startsWith("#P")) { 
     // store previous paragraph in the map 
     if (currKey != null) { 
      contentMap.put(currKey, buffer.toString()); 
      buffer = new StringBuffer(); 
     } 
     currKey = line.substring(3); 
    } 
    else { 
     buffer.append(line).append("\n"); 
    } 
} 

あなたはメモリにマップを持っていたら、あるとして、あなたがそれを使用するか、またはあなたが反復して何とか配列に変換できます。

0
byte[][] coords = new byte[X_MAX - X_MIN + 1][Y_MAX - Y_MIN + 1]; //your array with 0 and 1 as you wished 

try { 
    File file = new File("filename.txt"); 
    FileReader fileReader = new FileReader(file); 
    BufferedReader bufferedReader = new BufferedReader(fileReader); 
    //StringBuffer stringBuffer = new StringBuffer(); //i don't c why you need it here 
    String line; 
    while ((line = bufferedReader.readLine()) != null) { 
     //stringBuffer.append(line); 
     //stringBuffer.append("\n"); 
     if (line.startsWith("#P")){ 
      String[] parts = line.split(" "); 
      int x = Integer.parseInt(parts[1]); 
      int y = Integer.parseInt(parts[2]); 
      coords[x - X_MIN][y - Y_MIN] = 1; 
     } 
    bufferedReader.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
0

配列のインデックスは常に0から始まります。しかし、あなたのxとyの値(X_MIN < = X < X_MAXとY_MIN < = Y < Y_MAX)の合計範囲を知っていれば、それは本当に問題ではありません。

coor[X_MAX - X_MIN + 1][Y_MAX - Y_MIN + 1]; 

... 

void setValue(int x, int y, int value) { 
    coor[x - X_MIN][y - Y_MIN] = value; 
} 

int getValue(int x, int y) { 
    return coor[x + X_MIN][y + Y_MIN]; 
} 

よりよい解決策は、クラスの中に配列をラップ範囲チェックを提供し、多分ArrayList<ArrayList<int>>のように別のコンテナを使用します。

関連する問題