2012-03-07 2 views
0

Итак, у меня есть класс Linked List, который содержит все данные конструктора, необходимые для чтения файла, который у меня есть, а затем преобразовываю его в связанный список. Однако, когда он считывает данные файла, он неправильно добавляет строки и пробелы. Я использую system.out.println для проверки, и он выходит неправильно. Я не думаю, что это метод toString, потому что я так много перепутал и ничего не изменил. Мне нужна помощь в этом, потому что я не могу понять это. Спасибо!Связанный список не правильно читает файл

Информация о файле (в основном все данные на отдельных строках):

tobi 
tobi 
[email protected] 
tobi 
Mixed Breed 
Male 
3-4 
Virginia 
Walking 
lily 
lily 
[email protected] 
lily 
Yorkshire Terrier 
Female 
3-4 
Hawaii 
Jumping 
peppy 
peppy 
[email protected] 
peppy 
Chihuahua 
Male 
7-8 
Alaska 
Sleeping 
fluffy 
fluffy 
[email protected] 
fluffy 
MixedBreed 
Female 
3-4 
Virginia 
Walking 
flower 
flower 
[email protected] 
flower 
Chihuahua 
Female 
7-8 
Alaska 
Sleeping 

Связанный список:

import java.io.Serializable; 
    import java.util.*; 

    public class LinkedAccountList implements Serializable{ 

    private String username; 
    private String password; 
    private String email; 
    private String name; 
    private String breed; 
    private String gender; 
    private String age; 
    private String state; 
    private String hobby; 

    public LinkedAccountList (String username, String password, String email, String name, String breed, String gender, String age, String state, String hobby){ 
    this.username = username; 
    this.password = password; 
    this.email = email; 
    this.name = name; 
    this.breed = breed; 
    this.gender = gender; 
    this.age = age; 
    this.state = state; 
    this.hobby = hobby; 
    } 

    public String getUsername(){ 
    return username; 
    } 

    public String getPassword(){ 
    return password; 
    } 

    public String getEmail(){ 
    return email; 
    } 

    public String getName(){ 
    return name; 
    } 

    public String getBreed(){ 
    return breed; 
    } 

    public String getGender(){ 
    return gender; 
    } 

    public String getAge(){ 
    return age; 
    } 

    public String getState(){ 
    return state; 
    } 

    public String getHobby(){ 
    return hobby; 
    } 

    @Override 
    public String toString() { 
    return "Username: "+username+"\nPassword: "+password+"\nEmail: "+email+"\nName: "+name+"\nBreed: "+breed+"\nGender: "+gender+"\nAge: "+age+"\nState: "+state+"\nHobby: "+hobby; 
    } 

    public void setUsername(String u){ 
    username = u; 
    } 

    public void setPassword(String p){ 
    password = p; 
    } 

    public void setEmail(String e){ 
    email = e; 
    } 

    public void setName(String n){ 
    name = n; 
    } 

    public void setBreed(String b){ 
    breed = b; 
    } 

    public void setGender(String g){ 
    gender = g; 
    } 

    public void setAge(String a){ 
    age = a; 
    } 

    public void setState(String s){ 
    state = s; 
    } 

    public void setHobby(String h){ 
    hobby = h; 
    } 

    } 

чтение из файла и создать связанный список Method:

LinkedList<LinkedAccountList> account = new LinkedList<LinkedAccountList>(); 

    try 
    { 
    read(account, "file.txt"); 
    } catch (Exception e) 
    { 
    System.err.println(e.toString()); 
    } 
    display(account); 
    } 

    public static void read(LinkedList<LinkedAccountList> account, String inputFileName) throws java.io.IOException 
    { 
    BufferedReader infile = new BufferedReader(new FileReader(inputFileName)); 
    while(infile.ready()) 
    { 
    String username = infile.readLine(); 
    String password = infile.readLine(); 
    String email = infile.readLine(); 
    String name = infile.readLine(); 
    String breed = infile.readLine(); 
    String gender = infile.readLine(); 
    String age = infile.readLine(); 
    String state = infile.readLine(); 
    String hobby = infile.readLine(); 

    LinkedAccountList d = new LinkedAccountList(username, password, email, name, breed, gender, age, state, hobby); 
    account.add(d); 
    } 
    infile.close(); 
    } 

Вот что выглядит результат (Посмотрите внимательно, и вы можете увидеть проблему):

Username: tobi 
Password: tobi 
Email: [email protected] 
Name: tobi 
Breed: Mixed Breed 
Gender: Male 
Age: 3-4 
State: Virginia 
Hobby: Walking 
Username: 
Password: lily 
Email: lily 
Name: [email protected] 
Breed: lily 
Gender: Yorkshire Terrier 
Age: Female 
State: 3-4 
Hobby: Hawaii 
Username: Jumping 
Password: peppy 
Email: peppy 
Name: [email protected] 
Breed: peppy 
Gender: Chihuahua 
Age: Male 
State: 7-8 
Hobby: Alaska 
Username: Sleeping 
Password: fluffy 
Email: fluffy 
Name: [email protected] 
Breed: fluffy 
Gender: Mixed Breed 
Age: Female 
State: 3-4 
Hobby: Virginia 
Username: Walking 
Password: flower 
Email: flower 
Name: [email protected] 
Breed: flower 
Gender: Chihuahua 
Age: Female 
State: 7-8 
Hobby: Alaska 
Username: Sleeping 
Password: null 
Email: null 
Name: null 
Breed: null 
Gender: null 
Age: null 
State: null 
Hobby: null 
+0

Это не ответ на ваш вопрос, но почему ваш класс называется 'LinkedAccountList' вместо' Account'? – Taymon

+0

где ваш метод отображения? –

+0

Я планирую изменить его lol, но нет причин –

ответ

0

У вас нет валидации и регистрации. Вы должны, по крайней мере, создать метод:

public String readLine(BufferedReader br){ 
    String rl = br.readLine(); 
    if (rl.trim().length() > 2) { 
     return rl; 
    }else return readLine(br); 
} 

и использовать его как:

... 
    while(infile.ready()) 
     { 
      String username = readLine(infile); // instead of String username = infile.readLine(); 

Кроме того, используя так долго аргумент конструктора является подверженным ошибкам

LinkedAccountList (String имя пользователя, String пароль , String email, Название строки, String breed, String gender, String age, String state, String hobby) {

Использование ony setX(String arg) Метод. Это обычная практика в шаблоне DAO.

+0

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

+0

Итак, в основном я использовал ваш метод. И я добавил дополнительную строку к моему методу readfile благодаря Стивену C, поэтому теперь он работает. –

+0

Да, я ошибся, он все еще не работает –

0

Работы для меня. Проблема заключается в том, что ваш file.txt имеет дополнительную строку перевода строки между Walking и lily. Дважды проверьте файл и убедитесь, что его нет.

+0

У меня нет лишних строк или пробелов в текстовом файле ... Он просто не отображается правильно. –

0

Проблема, очевидно, не на выходной стороне. Ошибка в toString() не привела бы к тому, чтобы она выдавала такой вывод.

Похоже, что есть дополнительная пустая строка на входе после каждой записи. Это приводит к тому, что ваш метод read выходит из строя на одну дополнительную строку на каждой итерации цикла. Если это проблема, исправление заключается в добавлении дополнительного вызова readLine, чтобы пропустить пустую строку.


В отдельном примечании ваш выбор названия класса особенно плох. Класс LinkedAccountList не представляет собой список чего-либо. Он представляет собой единую учетную запись.

+0

Хорошо, попробуйте это –

+0

Я собираюсь изменить имя класса –

+0

Добавление дополнительной строки в конце цикла while помогло, но все еще есть проблема. Как только он доберется до последних двух учетных записей, он пропускает имя пользователя второго и последний, а также пропускает пароль последнего. –

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