2015-03-31 5 views
0

Я пытаюсь прочитать данные из текстового файла и использовать часть текста из этого файла для расчета их оплаты за сверхурочную работу и вывода его в файл с надбавкой .текст.Чтение, вычисление и запись данных в файл .txt

Файл данных будет выглядеть следующим образом:

bob 
50 
2.3 
julio 
60 
60.00 

Мой код до сих пор ниже:

import javax.swing.JOptionPane; 

import java.io.*; 
import java.text.DecimalFormat; 

public class ReadData { 
public ReadData() 
{ 
    try { 
     String[] firstLine = new String[100], 
     secondLine = new String[100], 
     thirdLine = new String[100]; 

     double hours[] = new double[100], wages[] = new double[100]; 
     String result[] = new String[100], formattedGrossPay[] = new String[100]; 
     double grossPay[] = new double[100]; 
     double excessHours[] = new double[100], extraPay[] = new double[100]; 
     String stringExcessHours[] = new String[100]; 

     int index; 

     for (index = 0; index < 100; index++) { 
     firstLine[index] = ""; 
     secondLine[index] = ""; 
     thirdLine[index ] = ""; 
     hours[index] = 0.0; 
     wages[index]= 0.0; 
    } 
    FileReader file = new FileReader("payroll.txt"); 
    BufferedReader buffer = new BufferedReader(file); 
    index = 0; 
    String line; 

    File check = new File("overtime.txt"); 
    FileWriter file2; 
    if(check.exists()) 
     file2 = new FileWriter("overtime.txt", true); 
    else 
     file2 = new FileWriter("overtime.txt"); 
    BufferedWriter buffer2 = new BufferedWriter(file2); 

    /* 
    FileWriter file1 = new FileWriter("overtime.txt"); 
    BufferedWriter buffer1 = new BufferedWriter(file1); 
    */ 

    while((line = buffer.readLine()) != null) 
    { 
     firstLine[index] = line; 
     secondLine[index] = buffer.readLine(); 
     thirdLine[index ] = buffer.readLine(); 

     hours[index] = Double.parseDouble(secondLine[index]); 
     wages[index] = Double.parseDouble(thirdLine[index]); 
     DecimalFormat df = new DecimalFormat("#.00"); 
     result[index] = df.format(wages[index]); 
     grossPay[index] = (hours[index] * wages[index]); 
     if (hours[index] > 40) 
     { 
      excessHours[index] = hours[index]-40; 
      extraPay[index] = excessHours[index] * (.5 * wages[index]); 
      grossPay[index]=grossPay[index]+extraPay[index]; 
     } 
     else 
     { 
      excessHours[index]=0; 
     } 

     //grossPayString[index] = Double.toString(grossPay[index]); 
     formattedGrossPay[index] = df.format(grossPay[index]); 

     JOptionPane.showMessageDialog(null, "Name: " + firstLine[index] + "\nHours: " 
     + hours[index] + "\nWages: $" + result[index] + "\nGross Pay: $" + formattedGrossPay[index], "Result", 
     JOptionPane.PLAIN_MESSAGE); 
     index++; 

     stringExcessHours[index] = Double.toString(excessHours[index]); 
     buffer2.write(firstLine[index]); 
     buffer2.newLine(); 
     buffer2.write(stringExcessHours[index]); 
     buffer2.newLine(); 
    } 

    buffer.close(); 
    buffer2.close(); 
    System.exit(0); 

    }//end of try 
    catch (IOException e) { System.out.println(e); } 
    }//end of ReadData 

public static void main(String[] args) 
{ 
    new ReadData(); 
} 
} 

Прямо сейчас, выход на мой overtime.txt файл будет выглядеть следующим образом:

0.0 

0.0 

Я получаю 0.0 каждый раз за их оплату сверхурочной работы, и вместо того, чтобы печатать имя в первой строке, пробел li ne печатается.

Любая помощь в решении этой проблемы при правильной записи данных в файл overtime.txt приветствуется.

+0

MessageDialog показывает правильные номера? –

+0

Да. Отображает имя как строку. Часы, заработная плата и брутто оплачиваются как двойные. – pHorseSpec

+0

Я думаю, что решение @ScaryWombat решит вашу проблему правильно. –

ответ

1

В вас код, который вы приращением индекс затем читает массив

как в

 index++; 

    stringExcessHours[index] = Double.toString(excessHours[index]); 
    buffer2.write(firstLine[index]); 
    buffer2.newLine(); 
    buffer2.write(stringExcessHours[index]); 
    buffer2.newLine(); 

изменение

 stringExcessHours[index] = Double.toString(excessHours[index]); 
    buffer2.write(firstLine[index]); 
    buffer2.newLine(); 
    buffer2.write(stringExcessHours[index]); 
    buffer2.newLine(); 

    index++; 
1

Это работает:

import javax.swing.JOptionPane; 
import java.io.*; 
import java.text.DecimalFormat; 

public class ReadData { 
    public ReadData() 
    { 
     try { 
      String[] firstLine = new String[100], 
      secondLine = new String[100], 
      thirdLine = new String[100]; 

      double hours[] = new double[100], wages[] = new double[100]; 
      String result[] = new String[100], formattedGrossPay[] = new String[100]; 
      double grossPay[] = new double[100]; 
      double excessHours[] = new double[100], extraPay[] = new double[100]; 
      String stringExcessHours[] = new String[100]; 

      int index; 

      for (index = 0; index < 100; index++) { 
       firstLine[index] = ""; 
       secondLine[index] = ""; 
       thirdLine[index ] = ""; 
       hours[index] = 0.0; 
       wages[index]= 0.0; 
      } 
      FileReader file = new FileReader("payroll.txt"); 
      BufferedReader buffer = new BufferedReader(file); 
      index = 0; 
      String line; 

      File check = new File("overtime.txt"); 
      FileWriter file2; 
      if(check.exists()) 
       file2 = new FileWriter("overtime.txt", true); 
      else 
       file2 = new FileWriter("overtime.txt"); 

      BufferedWriter buffer2 = new BufferedWriter(file2); 

     /* 
      FileWriter file1 = new FileWriter("overtime.txt"); 
      BufferedWriter buffer1 = new BufferedWriter(file1); 
      */ 

      while((line = buffer.readLine()) != null) 
      { 
       firstLine[index] = line; 
       String name = firstLine[index]; 

       secondLine[index] = buffer.readLine(); 
       int hoursWorked = Integer.parseInt(secondLine[index]); 

       thirdLine[index ] = buffer.readLine(); 
       double wage = Double.parseDouble(thirdLine[index]); 

       hours[index] = hoursWorked; 
       wages[index] = wage; 
       DecimalFormat df = new DecimalFormat("#.00"); 
       result[index] = df.format(wages[index]); 
       grossPay[index] = (hours[index] * wages[index]); 

       if (hours[index] > 40) 
       { 
        excessHours[index] = hours[index]-40; 
        extraPay[index] = excessHours[index] * (.5 * wages[index]); 
        grossPay[index]=grossPay[index]+extraPay[index]; 
       } 
       else 
       { 
        excessHours[index]=0; 
       } 

       //grossPayString[index] = Double.toString(grossPay[index]); 
       formattedGrossPay[index] = df.format(grossPay[index]); 

       JOptionPane.showMessageDialog(null, "Name: " + firstLine[index] + "\nHours: " 
        + hours[index] + "\nWages: $" + result[index] + "\nGross Pay: $" + formattedGrossPay[index], "Result", 
       JOptionPane.PLAIN_MESSAGE); 


       stringExcessHours[index] = Double.toString(excessHours[index]); 

       buffer2.write(name); 
       buffer2.newLine(); 
       buffer2.write("Excess Hours: " + stringExcessHours[index] + "\tExtra pay: " + extraPay[index]); 
       buffer2.newLine(); 
       index++; 
      } 

      buffer.close(); 
      buffer2.close(); 
      System.exit(0); 

     }//end of try 
     catch (IOException e) { System.out.println(e); } 
    }//end of ReadData 

    public static void main(String[] args) 
    { 
     new ReadData(); 
    } 
} 

Пожалуйста, дайте мне +1, если вы как мое решение.

P.S. - Вы можете использовать списки, а не массивы, поэтому размеры могут быть неограниченными (в этом примере более 100 сотрудников будут вызывать исключение ArrayIndexOutOfBounds). Вы также можете использовать хеш-карты вместо списков, с сотрудниками в качестве ключей и их заработной платой в качестве значений. Тогда у вас может быть другая хэш-карта сотрудников в качестве ключей, а их часы работают каждую неделю в качестве значений.

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