2015-11-10 2 views
0

У меня есть эти два класса: Contact и Phonebook:Чтение из текстового файла и создания массива объектов Java

public class Contact implements Comparable<Contact> { 
    private String name; 
    String[] numbers; 
    private final int NUMBER_LIMIT = 5; 
} 

public class Phonebook { 
    private final int CONTACT_LIMIT = 250; 
    Contact[] contacts; 
} 

Я хочу, чтобы преобразовать данные из обоих классов String и сохранить его в текстовый файл , Для этого я написал следующие функции:

public class Contact { 

    @Override 
    public String toString() { 
     StringBuilder str = new StringBuilder(); 
     int len = numbers.length; 

     str.append(name); 
     str.append(System.lineSeparator()); 
     str.append(len); 
     str.append(System.lineSeparator()); 

     for (int i = 0; i < len; i++) { 
      str.append(numbers[i]); 
      if (i != len - 1) 
       str.append(System.lineSeparator()); 
     } 

     return str.toString(); 
    } 
} 

public class Phonebook { 
    @Override 
    public String toString() { 
     StringBuilder str = new StringBuilder(); 

     for (int i = 0, n = contacts.length; i < n; i++) { 
      str.append(contacts[i].toString()); 
      if (i != n - 1) str.append(System.lineSeparator()); 
     } 

     return str.toString(); 
    } 

    public static boolean saveAsTextFile(Phonebook phonebook, String path) { 
     boolean saved = true; 
     PrintWriter toFile = null; 
     try { 
      toFile = new PrintWriter(new FileOutputStream(path)); 
      toFile.println(phonebook.toString()); 
     } 
     catch (FileNotFoundException e) { 
      saved = false; 
     } 
     finally { 
      toFile.close(); 
     } 
     return saved; 
    } 
} 

Следующий шаг чтения содержимого из существующего текстового файла и воссоздает объект в телефонной книге. Текстовый файл имеет следующий формат:

Contact name (String) 
Number of phone numbers (int) 
Phonenumber(s) (String) 

В текстовом файле может быть более одного контакта. До сих пор я эту функцию для создания контакта из строки:

public static Contact valueOf(String s) throws InvalidFormatException { 
     String lineSeparator = System.lineSeparator(); 
     String[] chunks = s.split(lineSeparator); 
     int len = chunks.length; 

     if (len < 2) throw new InvalidFormatException(); 

     //System.out.println(Arrays.toString(chunks)); 
     String name = chunks[0]; 
     String[] numbers = new String[Integer.parseInt(chunks[1])]; 
     for (int i = 2; i < len; i++) 
      numbers[i - 2] = chunks[i]; 

     Contact contact = null; 

     try { 
      contact = new Contact(name, numbers); 
      return contact; 
     } 
     catch (Exception e) { 
      throw new InvalidFormatException(); 
     } 
    } 

И это одно для создания телефонной книги (Это работа в процессе):

public static Phonebook loadFromTextFile(String path) throws FileNotFoundException, InvalidFormatException { 
    Scanner inputStream = new Scanner(new FileInputStream(path)); 
    ArrayList<String> contactInfo = new ArrayList<String>(); 
    int ctr = 0; 
    int numContacts; 
    String contactString = ""; 
    Contact contact = null; 

    while (inputStream.hasNextLine()) { 
     contactInfo.add(inputStream.nextLine()); 
     if (ctr == 1) { 
      numContacts = Integer.parseInt(contactInfo.get(ctr)); 
      for (int j = 0; j < numContacts; j++) { 
       contactInfo.add(inputStream.nextLine()); 
      } 
      System.out.println("contactString inside while loop:"); 
      contactString = String.join(System.lineSeparator(), contactInfo); 
      System.out.println(contactString); 
      contact = Contact.valueOf(contactString); 
      contactInfo.clear(); 
      System.out.println("contact inside while loop:"); 
      System.out.println(contact); 
      ctr = 0; 
     } 
     ctr++; 
    } 

Проблема Я что эта функция работает только для одного контакта в файле. Если их несколько, это не сработает. Что я делаю не так? Моя логика такова:

  • чтения строки из текстового файла и сохранить его в ArrayList

  • Если отсчитать количество контактов:

    • перебирать числа контактов, чтение каждую строку и хранить ее в ArrayList
  • Когда закончите, преобразуйте содержимое ArrayL ist в String, переместите его в контактString и вызовите Contact.valueOf (String s). Когда я получу эту работу, сохраните полученный контакт в контакте [].

  • Empty ArrayList и начать снова.

  • Повторите до EOF

Я не могу понять, что является причиной проблемы. Любая помощь приветствуется.

Примечание: Если это имеет значение, это домашнее задание.

EDIT: Пример файла .txt:

John Doe 
3 
3124354353 
1234324534 
5768324242 
Alice 
1 
0547623424 
Bob 
2 
7863257643 
3128443552 

ответ

2

Проблема кажется ctr переменной.
Он инициализируется 0

int ctr = 0; 

увеличивающегося в то время цикла

ctr++; 

и есть, если заявление в то время цикла

if (ctr == 1) { 

В есть также установлено 0

Итак, цикл while будет выполняться дважды, добавив 2 строки к contactInfo, затем добавьте еще numOfContacts строк в contactInfo, а затем попробуйте создать один contact.

Основываясь на том, как пример текстового файла выглядит, как я рекомендовал бы эту простую версию без ctr переменной

while (inputStream.hasNextLine()) { 
    contactInfo.add(inputStream.nextLine()); 
    int numContacts = Integer.parseInt(inputStream.nextLine()); 

    for (int j = 0; j < numContacts; j++) { 
     contactInfo.add(inputStream.nextLine()); 
    } 
    System.out.println("contactString inside while loop:"); 
    String contactString = String.join(System.lineSeparator(), contactInfo); 
    System.out.println(contactString); 

    contactInfo.clear(); 
    System.out.println("contact inside while loop:"); 
} 

Обратите внимание, что я определила contactString и numContacts в цикле, поскольку нет оснований для них существовать вне

+0

не будет выполняться цикл while while до конца файла? ctr не является частью его условия –

+0

Фактически, я всегда пропускаю второе имя таким образом. После инструкции 'if'' 'ctr' снова 1, что позволяет пропустить имя контакта перед' numOfContacts'. Я должен только изменить его на 'ctr = -1' –

+0

Фактически он может заходить за пределы. Вы не проверяете 'hasNextLine' в цикле for внутри цикла while. Я считаю, что способ использования 'ctr' приводит к получению только одного контакта. Будет здорово, если вы опубликуете пример текстового файла для этого –

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