2012-02-13 2 views
1

У меня есть текстовый файл, который я пытаюсь разбить с помощью токенизатора строки. Вот несколько строк из текстового файла:строка токенизатор останавливается после первой строки

Mary Smith 1 
James Johnson 2 
Patricia Williams 3 

Я пытаюсь разбить на первое имя, фамилию и идентификатор клиента.

Я до сих пор был в состоянии это сделать, но он останавливается после Мэри Куз.

Вот мой код:

public static void createCustomerList(BufferedReader infileCust, 
      CustomerList customerList) throws IOException 
{  


      String firstName; 
      String lastName; 
      int custId; 


      //take first line of strings before breaking them up to first last and cust ID 
      String StringToBreak = infileCust.readLine(); 
      //split up the string with string tokenizer 
      StringTokenizer st = new StringTokenizer(StringToBreak); 

      firstName = st.nextToken(); 

      while(st.hasMoreElements()) 
      { 
      lastName = st.nextToken(); 
      custId = Integer.parseInt(st.nextToken()); 
      CustomerElement CustomerObject = new CustomerElement(); 
      CustomerObject.setCustInfo(firstName,lastName,custId); 
      customerList.addToList(CustomerObject); 

      } 


    } 
+2

Я должен использовать camelCase для каждого объявления переменной. В вашем коде 'StringToBreak' и' CustomerObject' имеют начальные заглавные буквы, и это зарезервировано для типов (классов и интерфейсов). Это работает, но это приводит к путанице. – helios

ответ

1

Для внешнего контура, необходимо сохранить содержимое текущей строки в переменной stringToBreak, так что вы можете получить доступ к нему внутри цикла. Для каждой строки вам нужен новый StringTokenizer, поэтому он должен находиться внутри цикла.

String stringToBreak = null; 
while ((stringToBreak = infileCust.readLine()) != null) { 
    //split up the string with string tokenizer 
    StringTokenizer st = new StringTokenizer(stringToBreak); 
    firstName = st.nextToken(); 
    lastName = st.nextToken(); 
    custId = Integer.parseInt(st.nextToken()); 
} 
+0

Мне нужно добавить StringTokenizer st = new StringTokenizer (stringToBreak); прямо перед циклом while тоже нет? Я получаю сообщение об ошибке: exception in thread "main" java.lang.NullPointerException – Sackling

+0

Спасибо за редактирование. И это выглядит правильно, но теперь он просто печатает пустую строку вместо 1 – Sackling

+0

неважно, я идиот. Работал как шарм. Спасибо! – Sackling

0

Во-первых, вы хотите посмотреть на ваш цикл, в частности, как у вас есть ПгвЬЫате вне цикла, так что собирается бросить все из вас токенов прочь. Вы будете пытаться создавать новые объекты клиента без достаточной информации.

3
String StringToBreak = infileCust.readLine(); 

читает ПЕРВЫЙ текст из файла. И вы кормите StringTokenizer этим. Это нормально, что StringTokenized не находит больше токенов.

Вы должны создать второй цикл, охватывающий все это, чтобы читать каждую строку. Это:

outer loop: readLine until it gets null { 
    create a StringTokenizer that consumes *current* line 
    inner loop: nextToken until !hasMoreElements() 
} 

Ну, действительно, вам не нужно делать внутренний цикл, потому что у вас есть три разных поля. Достаточно с:

name = st.nextToken(); 
lastName = st.nextToken(); 
id = st.nextToken; 
+0

Хорошо, я получаю то, что вы говорите полностью, но мне трудно писать внешний контур. Мой цикл outter почти такой: while (infileCust.readLine()! = Null) { – Sackling

+0

Что вы подразумеваете под потреблением текущей строки? – Sackling

+0

Также в конце вы говорите, что мне не нужен внутренний цикл, поэтому я предполагаю, что мне просто нужно сказать токенизатору «потреблять» строку, но я не знаю метода и не могу найти его. – Sackling

Смежные вопросы