2015-11-26 5 views
2

Что я хочу сделать, это прочитать текстовый файл с людьми и животными. Он будет компилироваться, но имеет ошибку, когда я пытаюсь запустить его. Я думаю, мне нужен цикл for, чтобы прочитать stringtokenizer для расшифровки между человеком и животным в txt-файле, пока это мой класс драйвера.Чтение специального txt-файла в java

TXT файл:

Morely,Robert,123 Anywhere Street,15396,4,234.56,2 
Bubba,Bulldog,58,4-15-2010,6-14-2011 
Lucy,Bulldog,49,4-15-2010,6-14-2011 
Wilder,John,457 Somewhere Road,78214,3,124.53,1 
Ralph,Cat,12,01-16-2011,04-21-2012 
Miller,John,639 Green Glenn Drive,96258,5,0.00,3 
Major,Lab,105,07-10-2012,06-13-2013 
King,Collie,58,06-14-2012,10-05-2012 
Pippy,cat,10,04-25-2015,04-25-2015 
Jones,Sam,34 Franklin Apt B,47196,1,32.09,1 
Gunther,Swiss Mountain Dog,125,10-10-2013,10-10-2013 
Smith,Jack,935 Garrison Blvd,67125,4,364.00,4 
Perry,Parrot,5,NA,3-13-2014 
Jake,German Shepherd,86,11-14-2013,11-14-2013 
Sweetie,tabby cat,15,12-15-2013,2-15-2015 
Pete,boa,8,NA,3-15-2015 

Источник:

import java.util.Scanner; 
import java.util.StringTokenizer; 
import java.io.File; 
import java.io.IOException; 
/** 
* This is my driver class that reads from a txt file to put into an array and uses the class refrences so it can use the menu and spit out 
* 
* @author ****** 
* @version 11/25/2015 
*/ 
public class Driver 
{ 
    /** 
    * Constructor for objects of class Driver, what it does is read in the txt file gets the two class refrences and loops through to read through the whole file looking for string tokens to go to the next line 
    * and closes the file at the end also uses for loop to count number of string tokens to decipher between human and pets. 
    */ 
    public static void main(String[] args) throws IOException 
    { 
     Pet p; 
     Human h; 
     Scanner input; 
     char menu; 
     input = new Scanner(new File("clientdata.txt")); 

     int nBalance; 
     int id; 

     /** 
     * this while statement goes through each line looking for the string tokenizer ",". I want to count each "," to decipher between Human and Animal 
     */ 
     while(input.hasNext()) 
     { 
      StringTokenizer st = new StringTokenizer(input.nextLine(), ","); 
      h = new Human(); 
      h.setLastName(st.nextToken()); 
      h.setFirstName(st.nextToken()); 
      h.setAddress(st.nextToken()); 
      h.setCiD(Integer.parseInt(st.nextToken())); 
      h.setVisits(Integer.parseInt(st.nextToken())); 
      h.setBalance(Double.parseDouble(st.nextToken())); 
      p = new Pet(st.nextToken(), st.nextToken(), Integer.parseInt(st.nextToken()), st.nextToken(), st.nextToken()); 
     } 
     /** 
     * this is my seond while statement that loops the case switch statements and asks the user for client ID 
     */ 
     menu = 'Y'; 
     while(menu == 'y' || menu == 'Y') { 
      System.out.print("\nChose one:\n A- client names and outstanding balance \n B- client's pets, name, type and date of last visit\n C-change the client's outstanding balance: "); 
      menu = input.next().charAt(0); 
      System.out.print("Enter client ID: "); 
      id = input.nextInt(); 
      h = new Human(); 
      if(id == h.getCiD())//if the id entered up top is equal to one of the id's in the txt file then it continues to the menu 
      { 
       p = new Pet(); 
      switch(menu) 
     { case 'A': 
      System.out.println("client name: " + h.getFirstName() + "outstanding balance: " + h.getBalance()); 
      break; 
      case 'B': 
      System.out.println("pet's name: " + p.getName() + "type of pet: " + p.getTanimal() + "date of last visit: " + p.getLastVisit()); 
      break; 
      case 'C': 
      System.out.println("what do you want to change the clients balances to?"); 


     input.close(); 
     } 
    } 
    else// if not then it goes to this If statement saying that the Client does not exist 
    { 
     System.out.println("Client does not exist."); 
    } 
    } 
} 
} 
+0

Получил пример формата файла? Возможно, вам повезло с использованием 'String # split', а не' StrongTokenizer' – MadProgrammer

+0

Да, сэр, я должен просто скопировать и прочесть несколько? – Dust

+0

Да, пожалуйста, добавьте их на вопрос – MadProgrammer

ответ

2

У вас есть целый ряд вопросов, которые необходимо преодолеть ...

  • для каждой линии необходимо определить тип данных линия представляет
  • вы урожденная d каким-то образом отслеживать данные вы загрузили (из клиентов и их домашних животных)
  • Вы должны каким-то образом связать каждый домашнее животное с его владельцем

Первое может быть сделано в ряде пути, предполагая, что мы можем изменить данные. Вы можете сделать первый токен значимым (human, pet); вы могли бы использовать JSON или XML. Но давайте предположим на данный момент, вы не можете изменить формат.

Ключевое различие между двумя типами данных - это количество токенов, которые они содержат, 7 для людей, 5 для домашних животных.

while (input.hasNext()) { 
    String text = input.nextLine(); 
    String[] parts = text.split(","); 
    if (parts.length == 7) { 
     // Parse owner 
    } else if (parts.length == 5) { 
     // Parse pet 
    } // else invalid data 

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

Как ни странно достаточно, я только заметил, что последний элемент - это int и, кажется, представляет количество домашних животных !!

Morely,Robert,123 Anywhere Street,15396,4,234.56,2 
            ------------^ 

Но это не помогает нам для владельцев.

Для владельцев, вы могли бы использовать List какой-то и когда-либо создать новый Human, вы бы просто добавить их к List, к примеру ...

List<Human> humans = new ArrayList<>(25); 
//... 
    if (parts.length == 7) { 
     // Parse the properties 
     human = new Human(...); 
     humans.add(human); 
    } else if (parts.length == 5) { 

В-третьих, для домашние животные, каждый Pet должен связан непосредственно с владельцем, например:

Human human = null; 
while (input.hasNext()) { 
    String text = input.nextLine(); 
    String[] parts = text.split(","); 
    if (parts.length == 7) { 
     //... 
    } else if (parts.length == 5) { 
     if (human != null) { 
      // Parse pet properties 
      Pet pet = new Pet(name, type, age, date1, date2); 
      human.add(pet); 
     } else { 
      throw new NullPointerException("Found pet without human"); 
     } 
    } 

Хорошо, так что все это делает, это каждый раз, когда мы создаем Human, мы сохраняем ссылку на Создан «текущий» или «последний». Для каждой «домашней» линии, которую мы анализируем, мы добавляем ее владельцу.

Теперь класс Human может использовать либо массив, либо List для управления домашними животными, либо будет работать, как мы знаем ожидаемое количество домашних животных. Затем вы предоставили бы геттеры в классе Human, чтобы получить ссылку на домашних животных.

Поскольку вне контекста кода может быть трудно читать, это пример того, что вы могли бы сделать ...

Scanner input = new Scanner(new File("data.txt")); 
List<Human> humans = new ArrayList<>(25); 
Human human = null; 
while (input.hasNext()) { 
    String text = input.nextLine(); 
    String[] parts = text.split(","); 
    if (parts.length == 7) { 
     String firstName = parts[0]; 
     String lastName = parts[1]; 
     String address = parts[2]; 
     int cid = Integer.parseInt(parts[3]); 
     int vists = Integer.parseInt(parts[4]); 
     double balance = Double.parseDouble(parts[5]); 
     int other = Integer.parseInt(parts[6]); 
     human = new Human(firstName, lastName, address, cid, vists, balance, other); 
     humans.add(human); 
    } else if (parts.length == 5) { 
     if (human != null) { 
      String name = parts[0]; 
      String type = parts[1]; 
      int age = Integer.parseInt(parts[2]); 
      String date1 = parts[3]; 
      String date2 = parts[4]; 
      Pet pet = new Pet(name, type, age, date1, date2); 
      human.add(pet); 
     } else { 
      throw new NullPointerException("Found pet without human"); 
     } 
    } 
} 
0

Что об использовании split() функции вместо использования StringTokenizer?

Say, Вы можете изменить свой первый while цикл, как показано ниже:

while (input.hasNext()) { 
// StringTokenizer st = new StringTokenizer(input.nextLine(), ","); 
    String[] tokens = input.nextLine().split(","); 
    if (tokens.length == 7) { 
     h = new Human(); 
     h.setLastName(tokens[0]); 
     h.setFirstName(tokens[1]); 
     h.setAddress(tokens[2]); 
     h.setCiD(Integer.parseInt(tokens[3])); 
     h.setVisits(Integer.parseInt(tokens[4])); 
     h.setBalance(Double.parseDouble(tokens[5])); 
    } else { 
     p = new Pet(tokens[0], tokens[1], Integer.parseInt(tokens[2]), tokens[3], tokens[4]); 
    } 
} 

И для отслеживания домашних любимцев принадлежит к которому человек, вы можете добавить в ArrayList типа Pet в Human класса, как показано ниже:

ArrayList<Pet> pets = new ArrayList<>(); 

И у вас есть еще один ArrayList типа Human имени humans в главной функции. Таким образом, вы могли бы добавить в if блок, как:

humans.add(h); 

и в разделе else, вы могли бы добавить в else блока:

humans.get(humans.size()-1).pets.add(p); 
+0

Есть 7 жетонов на 'Человека': P - Тогда как вы 1- Следите за всеми людьми, которых вы создали, и 2- связываете с ними своих питомцев? – MadProgrammer

+0

@MadProgrammer Oh! Опечатка. Я думаю, он мог бы справиться с этим, добавив arrayList в класс 'Human'. В любом случае, спасибо. – manetsus

0

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

public void differentiate(){ 
    try { 
     Scanner scan=new Scanner(new BufferedReader(new FileReader("//your filepath"))); 
      Map<String,List<String>> map=new HashMap<String, List<String>>(); 
      while(scan.hasNextLine()){ 
      List<String> petList=new ArrayList<String>(); 
      String s=scan.nextLine(); 
      String str[]=s.split(","); 
      String name=str[1]+" "+str[0]; 
      int petCount=Integer.parseInt(str[str.length-1]); 
       for(int i=1;i<=petCount;i++){ 
       String petString=scan.nextLine(); 
       petList.add(petString); 
       } 
       map.put(name, petList); 
      } 
      Set<String> set=map.keySet(); 
      for(String str:set){ 
       System.out.println(str+" has "+map.get(str)+" pets"); 
      } 
     } 
     catch (FileNotFoundException e) { 
     System.out.println(e.getMessage()); 
    } 

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