2015-03-31 99 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加班费,而不是在第一行打印名字,空白里ne被打印。

任何帮助解决这个问题的正确写入数据到overtime.txt文件将不胜感激。

+0

MessageDialog显示正确的数字? – 2015-03-31 00:29:36

+0

是的。以字符串形式显示名称。工时和工资总额显示为双打。 – pHorseSpec 2015-03-31 00:34:13

+0

我认为@ScaryWombat解决方案将正确解决您的问题。 – 2015-03-31 00:35:02

回答

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异常)。您可能还想使用哈希映射而不是列表,将员工作为关键字并将他们的工资作为值。然后,您可以将员工的另一个散列图作为关键字,并将他们每周的工作时间作为值。