2015-07-20 6 views
1

Ну, я почти закончил с моим мировым редактором благодаря этому замечательному сообществу, единственное, что мне нужно знать, это то, как я могу сказать, что прочитал код файла для обработки конкретных букв. Когда я нажимаю enter на моей клавиатуре, я буду писать координаты Vector3f в текстовый файл, этот Vector3f является позицией моего активного GameObject. Мой метод ProcessText может прочитать текстовый файл и обрабатывать координаты, однако он может читать только ONY тип формата:Java делает учетную запись для чтения файлов для определенных букв

public void ProcessText() 
    {  
     String file_name = "C:/Users/Server/Desktop/textText.txt"; 

     try 
     {   
      ProcessCoords file = new ProcessCoords(file_name); 
      String[] aryLines = file.OpenFile(); 

      int i; 
      for (i = 0; i < aryLines.length; i++) 
      { 
       System.out.println(aryLines[i]);  

       if(aryLines[i].startsWith("makeGrass:")) { 
         String Arguments = aryLines[i].substring(aryLines[i].indexOf(":")+1, aryLines[i].length()); 
         String[] ArgArray = Arguments.split(","); 

         this.makeGrass(Double.parseDouble(ArgArray[0]), 
             Double.parseDouble(ArgArray[1]), 
             Double.parseDouble(ArgArray[2]));      
       } 
      } 
     } catch(IOException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 

В приведенном выше примере мой метод ProcessText может обрабатывать только координаты, если они записаны так:

makeGrass:x,y,z    //for example makeGrass:5,1,9 

Но когда я нажимаю войти и написать координаты от того, что мне мой двигатель дает я получаю различный формат:

makeGrass:(x y z)   //for example makeGrass:(3 1 4) 

Теперь то, что мне нужно знать, хо w Мне нужно переписать код в моем методе ProcessText, чтобы он учитывал другой формат с скобками в начале и конце, а также с пробелами для sepearta x от y и y вместо z вместо запятых.

Я действительно не знаю, где еще я найду ответ на этот вопрос, поэтому я бы оценил любую помощь и объяснение того, как это работает.

Большое спасибо!

+1

'ArgArray = Arguments.substring (1, Arguments.length() - 2) .split (" ");' – maraca

ответ

0

Вы хотите, чтобы принять как можно больше форматов, как это возможно?

Вместо расщепления Я хотел бы попробовать, чтобы соответствовать, это безопаснее и не требует какой-либо предварительной или последующей обработки входных или полученных подстрок:

Pattern pattern = Pattern.compile("([0-9]+)"); // outside of method 

long[] ArgArray = new long[3]; 
Matcher matcher = pattern.matcher(Arguments); 
int i = 0; 
while (matcher.find() && i < 3) { 
    ArgArray[i++] = Long.parseLong(matcher.group(1)); 
} 
// there was a mistake if i < 3, otherwise you have 3 numbers in ArgArray 

Если вы хотите разделить, вы может быть может попробовать это: split("[^0-9]+")

Чтобы соответствовать только makeGrass: (хуг)

Pattern pattern = Pattern.compile("^makeGrass:\\(([0-9]+) ([0-9]+) ([0-9]+)\\)$"); 

Как это вы можете d прямое соответствие линии и 3 числа в группах 1 - 3 (как строка) после вызова find один раз, if (matcher.find()) решит, является ли это допустимой линией makeGrass, и если это возможно, она может быть обработана в if.

+0

Нет. Я не хочу принимать как можно больше форматов только makeGrass: (xyz), но мне также интересно, как это работает, потому что в будущем я, возможно, захочу написать и читайте из файла другие вещи, а не только некоторые координаты, как в этом случае. спасибо за подсказку! – DisasterCoder

+0

@DisasterCoder ok, я добавил другую версию, это просто регулярное выражение (\ должно быть удвоено, потому что это также символ escape в Java Strings). – maraca

+0

Спасибо, я попробую это как можно скорее, только одно: цифры - плавающие, обычно координаты будут чем-то вроде (1.23333 1.56665 5.88769) или что-то похожее ... это будет работать, если вы только объявляете от нуля до 9? – DisasterCoder

0

Если вы можете гарантировать, что в формате makeGrass не будет пробелов: x, y, z и что в нем нет скобок, либо вы можете использовать String.replaceAll() ... Что-то вроде ниже:

myString = "makeGrass:(3 1 4)" 
myString = myString.replaceAll("\(", ""); //replace (with empty space 
myString = myString.replaceAll("\)", ""); //replace) with empty space 
myString = myString.replaceAll(" ", ","); //replace spaces with commas 

, то вам не нужно различных методов для обработки двух типов ввода. только формат, как показано выше, и передать оба входа к тому же методу

Идя таким образом, вам не нужно будет разделить на определенные символов, а затем восстановить строку, чтобы соответствовать выбранному формату

+0

Я действительно не понимаю, что вы говорите мне, неужели вы стараетесь меня изменить способ координаты записываются в файл? Потому что если так, то я должен сказать, что это было бы намного сложнее, чем я думаю, это должно быть .. но, может быть, вы можете показать мне, как вы думаете, что часть кода вписывается в мой метод ProcessText, потому что я действительно не понимаю, как я должен реализовать ваш код ..? – DisasterCoder

+0

, поэтому ваша программа будет считывать входные данные, скажем, что введен неправильный формат makeGrass: (3 1 4) ... тогда вы использовали бы упомянутые выше 4 строки, и это превратило бы ваш вход в правильный формат makeGrass : 3,1,4, то вы можете обработать его так же, как и до – GregH

+0

. Я не думаю, что это сработало бы так легко, так как запись в файл работает с этим кодом здесь: data.writeToFile («makeGrass:» + (GetTransform() .GetPos())); Чтобы получить координаты, я использую класс Transform моего движка, который не подходит для методов Vector3f. Я не думаю, что у меня достаточно опыта, чтобы реализовать свою идею в моем коде. – DisasterCoder

0

Просто разделить с регулярным выражением: [\s,] Разделяет струну в местах, где есть либо white space, либо ,.

И использовать это, чтобы избавиться от каких-либо скобок, если он присутствует:

Arguments = Arguments.replaceAll("\\(", "").replaceAll("\\)", ""); 

( и ) являются частью регулярных выражений нотации. Таким образом, они должны быть экранированы с \ и \, являющимся нотной Java, необходимо сбежать с другого \. Следовательно, он становится `` \ (". И мы должны заменить строку и сохранить ее обратно в переменную String. Поскольку Java передается по значению. Обе операции выполняются в одной строке.

Измененный код для метода:

public void ProcessText() {  
    String file_name = "C:/Users/Server/Desktop/textText.txt"; 



public void ProcessText() 
{  
    String file_name = "C:/Users/Server/Desktop/textText.txt"; 

    try 
    {   
     ProcessCoords file = new ProcessCoords(file_name); 
     String[] aryLines = file.OpenFile(); 

     int i; 
     for (i = 0; i < aryLines.length; i++) 
     { 
      System.out.println(aryLines[i]);  

      if(aryLines[i].startsWith("makeGrass:")) { 
        String Arguments = aryLines[i].substring(aryLines[i].indexOf(":")+1, aryLines[i].length()); 

        Arguments = Arguments.replaceAll("\\(", "").replaceAll("\\)", ""); 

        String[] ArgArray = Arguments.split("[\\s,]"); 


        this.makeGrass(Double.parseDouble(ArgArray[0]), 
            Double.parseDouble(ArgArray[1]), 
            Double.parseDouble(ArgArray[2])); 
      } 
     } 
    } catch(IOException e) { 
     System.out.println(e.getMessage()); 
    } 
} 
+0

Хорошо, но делает это также объясняет скобки? Это makeGrass: (xyz) не просто makeGRass: xyz .. но спасибо за подсказку! – DisasterCoder

+0

Привет, я думаю, это может сработать, но ваш код дает мне ошибку: Arguments.replaceAll ("\ ("," "), он говорит о недопустимой последовательности именования ..? – DisasterCoder

+0

Я сделал коррекцию и проверил ее тоже. Это будет работать. Конечно, это была моя ошибка. Я забыл поставить 2 \ s. вам нужно было сбежать. –