остановка токенайзера строки после первой строки - PullRequest
1 голос
/ 13 февраля 2012

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

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);

            }


    }

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012
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;
1 голос
/ 13 февраля 2012

Для внешнего цикла вам необходимо сохранить содержимое текущей строки в переменной 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 голосов
/ 13 февраля 2012

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

...