2016-11-06 3 views
0

Я пытаюсь написать класс, который анализирует текстовый файл, хранит информацию в массиве в зависимости от того, в каком году сотрудничал сотрудник, и создать сотрудника, продавца или исполнительного объекта на основе каждой строки. Мой профессор дал нам эту линию, чтобы разобрать годConfused about parsing method

while ((line = br.readLine()) != null) 
    { 
     int year = Integer.parseInt(line.substring(0,4)); 
     Employee e = getEmployee(line); 
    } 

И этот метод для разбора остальной части документа

public static Employee getEmployee(String line) 
{ 
    Employee e= new Employee() 
    String[] splitWithComma = line.split(","); 
    String first = splitWithComma[0]; 
    String[] firstSplit = first.split(" "); 
    String second = splitWithComma[1]; 
    String[] secondSplit = second.split(" "); 
    String third = splitWithComma[2]; 
    String[] thirdSplit = third.split(" "); 
    String fourth = splitWithComma[3]; 
    String[] fourthSplit = fourth.split(" "); 
    String fifth=splitWithComma[4]; 
    String[] fifthSplit = fifth.split(" "); 


} 

Я запутался о том, как я должен инициализировать объект Employee в классе getEmployee и если мне нужно, чтобы разобрать любые мои двойники в методе в то время, и как сделать это

Вот мой текстовый файл

2014, Employee, John Baker, 15000 
2014, Salesman, Amanda Stein, 30000, 1100000 
2014, Executive, Jessica Kettner, 53 
2015, Employee,Zach Edwards, 20000 
2015, Salesman,Shelby Douglas, 45000, 2345 
2015, Executive, Corey Matthews, 67000, 48 

Мой класс сотрудник

import java.util.*; 

public class Employee 
{ 
private String name; 
private double monthlySalary; 

public Employee(String name, double monthlySalary) 
{ 
    this.name=name; 
    this.monthlySalary=monthlySalary; 
} 



public String getName() { 
    return name; 
} 



public void setName(String name) { 
    this.name = name; 
} 



public double getMonthlySalary() { 
    return monthlySalary; 
} 



public void setMonthlySalary(int MonthlySalary) 
{ 

} 



public double annualSalary() 
{ 
    return monthlySalary*12; 
} 







public String toString() 
{ 
    String str; 
    str="Name: "+name; 
    str+="\nMonthly Salary: "+monthlySalary; 
    return str; 
} 
} 

И мой водитель

import java.io.*; 
import java.util.*; 
public class employeeDriver 
{ 
public static void main(String[] args) 
{ 
    String line; 
    String input; 
    Scanner readInput=null; 
    Scanner readFile = null; 
    BufferedReader br=null; 

    try 
    { 
     br = new BufferedReader(new FileReader("tester.txt")); 
    } 
    catch(FileNotFoundException e) 
    { 
     System.out.println("The file can't be opened"); 
     System.exit(0); 
    } 


try 
{ 
    while ((line = br.readLine()) != null) 
    { 
     int year = Integer.parseInt(line.substring(0,4)); 
     Employee e = getEmployee(line); 
    } 

} 

catch (IOException ioe) 
{ 
    System.out.println("Can't read file"); 
} 
finally 
{ 
    System.exit(0); 
} 

} 


public static Employee getEmployee(String line) 
{ 
    Employee e= new Employee() 
    String[] splitWithComma = line.split(","); 
    String first = splitWithComma[0]; 
    String[] firstSplit = first.split(" "); 
    String second = splitWithComma[1]; 
    String[] secondSplit = second.split(" "); 
    String third = splitWithComma[2]; 
    String[] thirdSplit = third.split(" "); 
    String fourth = splitWithComma[3]; 
    String[] fourthSplit = fourth.split(" "); 
    String fifth=splitWithComma[4]; 
    String[] fifthSplit = fifth.split(" "); 


} 
} 
+0

Прочтите помощь для ['string.split()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split (java.lang.String)), это может помочь ... – Lucero

+0

Я понимаю, как работает split, я просто не уверен, как метод getEmployee будет анализировать остальную часть текстового файла и как его сохранить в моем объекте Employee – WILLO567

+0

'getEmployee' только для анализа по одной строке за раз; каждая строка текстового файла считывается, а затем анализируется. Кроме того, мой комментарий относительно справки состоял в том, что записи разделены запятыми, а не разделены пробелами, поэтому, глядя на код, который вы опубликовали, у меня создалось впечатление, что было непонятно, как это работает. – Lucero

ответ

0

Чтобы ответить на ваш первый вопрос, конструктор Employee принимает строку и дважды в качестве входных данных, поэтому при создании нового сотрудника-объект вы должны (если вы сделаете другой конструктор) поставить эти значения, как это:

Employee e = new Employee("John Baker", 15000); 

Для бита синтаксического анализа, это выглядит как мет getEmployee d, как ожидается, справиться с этим, так что все, что вы положите в время цикла это

Employee e = getEmployee(line); 

Метод getEmployee является неполным, хотя. Поскольку вам нужно имя и зарплата уже при создании объекта Employee, сначала нужно выполнить синтаксический анализ, а затем создать объект.

О разборе двойников, есть метод Double.parseDouble (String), но мне кажется, что в тексте файл зарплата форматируется в виде целых чисел в любом случае, и если вы попытаетесь сделать что-то вроде

int salary = Integer.parseInt(salaryStr); 
Employee e = new Employee("John Baker", salary); 

то Java должен автоматически перевести целое число в double. Должна ли заработная плата быть двойной или int в самом классе, является другой историей.

+0

ОК, поэтому информация в getEmployee обрабатывает информацию. Я больше не хватает информации для синтаксического анализа, а если нет, как объявить ее для сотрудника? Могу ли я пройти три и четыре, так как у них есть имя сотрудника и зарплата? И что бы я сделал для моих продавцов и исполнительных подклассов? – WILLO567

+1

Все зависит от того, каковы ваши требования для класса Employee. Кажется, что вы делаете много ненужных разделов, все, что вам нужно, действительно находится в первой строке «splitWithComma».Чтобы отразить различные типы сотрудников, было бы целесообразно использовать суперкласс «Сотрудник», а затем у него наследовать «Регулярный рабочий», «Продавца» и «Исполнительный». – Lidae