2016-07-27 7 views
2

У меня есть текстовый файл, который содержит позиции, как это:Как прочитать определенный символ для определенного символа из файла в java?

enter image description here

#p показывает X, Y координаты, так что первый * после #P ряду имеет (6, -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(); 
    } 

Я хочу сохранить координаты в двухмерном массиве, но есть другая проблема. Как сохранить и т. Д. -1, -1?

+0

Знаете ли вы, каково наименьшее значение координаты? Если это так, вы можете просто компенсировать все положительной константой. –

+0

Почему два измерения? вы хотите coor [x] [y] == true, если точка существует? Это невозможно, так как у вас есть отрицательные значения. –

+0

Это игра жизни, и моя идея состоит в том, чтобы иметь два массива с 0 и 1 значениями, один для текущего состояния, а другой - для следующего состояния. Вот почему я хотел бы сделать двухмерный массив из текстового файла. – 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

массив индексов в Java всегда начинаются с 0. Но это не проблема, если вы знаете, общие диапазоны вашего х и у значений (X_MIN < = х < X_MAX и Y_MIN < = у < 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>>.