简体   繁体   English

Java:如何将用户输入与文本文件中的列进行比较?

[英]Java: How do I compare user input to columns in text file?

I'm pretty new to Java, so after several days of trying to figure out how to compare user input to a column in a text file, I am in desperate need of help. 我对Java还是很陌生,因此经过几天的尝试来弄清楚如何将用户输入与文本文件中的列进行比较之后,我迫切需要帮助。 I want to be sure that an employee who punches-in has not punched-in once before without punching-out after that. 我想确保打孔的员工之前没有打过孔,之后又没有打过孔。 In addition, I would like to be able to ensure that a user cannot punch-out of the system unless they have previously punched-in. 另外,我希望能够确保用户除非事先进行过打入,否则无法对系统进行打出。 I know that I have to split the lines in the text file in order to make them accessible separately, but I don't know how to compare them to user input. 我知道我必须对文本文件中的行进行分割,以使其分别可访问,但是我不知道如何将它们与用户输入进行比较。 Any help is greatly appreciated! 任何帮助是极大的赞赏! My code is as follows: 我的代码如下:

    import java.text.*;
    import java.util.*;
    import java.io.*;
    import java.nio.file.*;  

public class TimeClockApp
    {
    // declare class variables
    private static EmployeeDAO employeeDAO = null;
    private static TimeClockDAO timeClockDAO = null;
    private static Scanner sc = null;
    // format date and time / //HH converts hour in 24 hours format (0-23), day calculation
    private static DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

public static void main(String[] args) throws Exception
{
    // set the class variables
    employeeDAO = DAOFactory.getEmployeeDAO();
    timeClockDAO = DAOFactory.getTimeClockDAO();
    sc = new Scanner(System.in);
    int employeeID = 0;

    List<Employee> employees = employeeDAO.readEmployees();
    List<TimeClock> timePunches = timeClockDAO.readTimePunches();
    if(timePunches == null)
    {
        timePunches = new ArrayList<TimeClock>();
    }

    // display a welcome message
    System.out.println("Welcome to the Punch-In/Punch-Out Screen\n");

    // print option menu
    System.out.print("Please choose an option below:" + "\n"
           + "I. Punch In" + "\n"
           + "O. Punch Out" + "\n");

    String choice = "";
    // get input from user
    Scanner sc = new Scanner(System.in);

    while(choice != null)
    {
        // get input from user "i" or "o"
        while (!choice.equalsIgnoreCase("i") && !choice.equalsIgnoreCase("o"))
        {
            // it will not continue if user does not enter a valid choice
            choice = Validator.getScreenChoice(sc, "Choice: ");
            if(!choice.equalsIgnoreCase("i") && !choice.equalsIgnoreCase("o"))
            {
                System.out.println("Invalid choice.  Please try again.");
            }
        }
        System.out.println(); // print a blank line

        if(!choice.isEmpty())
        {
            // create employee object
            Employee employee = null;

            System.out.println("PUNCH CLOCK");
            System.out.println("-----------");

            // read employee ID and compare to employee.txt
            while(employee == null)
            {
                employeeID = Validator.getEmployeeID(sc,
                        "Enter Employee ID:    ");

                for(Employee e : employees)
                {
                    if(e.getEmployeeID() == employeeID)
                    {
                        employee = e;
                        break;
                    }
                }
            }
            // if employee ID is valid, have they punched in already?
            // if not, try again.

            // read timeclock.txt
           timeClockDAO.readTimePunches();

            if(employeeID == employee.getEmployeeID() && choice.equalsIgnoreCase("o")) // <-- This is where I'm having trouble
            {

               if(timePunches.contains("i"))
                {
                    if(timePunches.contains(employeeID))
                    {
                        System.out.println("Employee " + employeeID + " has already punched in. Please try again.");
                    }
                }

                // has employee punched in?  If yes, continue. <-- Beginning here, NetBeans ignores this whole deal
                for(TimeClock t : timePunches)
                {
                    if(t.getPunchInOrOut() && choice.equalsIgnoreCase("i"))
                    {
                        timePunches = t;
                        break;
                    }
                }
               // if employee has not punched in, try again
               if(timePunches.contains("i"))
                {
                    if(timePunches.contains(employeeID))
                    {
                        System.out.println("Employee " + employeeID + " has not punched in yet. Please try again.");
                    }
                }
            } // <-- NetBeans stops ignoring and continues from here

            TimeClock newTimePunch = new TimeClock(employeeID, new Date(), choice);

            // if employee ID is valid,
            // addition of date and time to arraylist/text file
            timePunches.add(newTimePunch);

            //write to the file
            timeClockDAO.writeTimePunch(newTimePunch);

            // conditional statement for in/out + formatting
            System.out.println("Punch-" + (choice.equalsIgnoreCase("i") ? "In" : "Out") + " Successful!" + "\n"
                             + "Date & Time:   " + dateFormat.format(new Date()) + "\n"
                             + "Employee Name: " + employee.getFirstName() + " " + employee.getLastName() + "\n"
                             + "Employee ID:   " + employee.getEmployeeID() + "\n");

            System.out.println(); // print a blank line
            break;
        }
        else
        {
            System.out.println("Invalid entry. Please try again.");
        }
    }

    // press enter to continue to the main screen
    System.out.printf("Press enter to return to the main screen. ");
    sc.nextLine();
    System.out.println("Okay, returning to Main Screen.  Goodbye!");
    System.out.println(); // print a blank line

    MainScreenApp.main(args);
}

} }

Can I use the timeClockDAO.readTimePunches() portion of my code to read and compare columns in the text file to the user's input since the columns are already split there? 我可以使用代码的timeClockDAO.readTimePunches()部分读取文本文件中的列并将其与用户输入进行比较,因为这些列已经被拆分了? The timeClockDAO.readTimePunches() method from the List<TimeClock> timePunches() list is as follows: List<TimeClock> timePunches()列表中的timeClockDAO.readTimePunches()方法如下:

        @Override
public List<TimeClock> readTimePunches()
{
    if(timePunches != null)
        return timePunches;

    timePunches = new ArrayList<TimeClock>();
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    if(Files.exists(Paths.get(timeClockPath))) // prevent the FileNotFoundException
    {
        try(BufferedReader in = new BufferedReader(
                                new FileReader(
                                new File(timeClockPath))))
        {
            // read all employees in the file into the array list
            String line = in.readLine();
            while(line != null)
            {
                // split text file into columns
                String[] columns = line.split(EmployeeTextFile.FIELD_SEP);
                /*if(columns.length != 3)
                {
                    System.err.println("Could not read text file for Time Punches.");
                    return null;
                }*/
                // employee ID column
                int employeeID = Integer.parseInt(columns[0]);
                // time stamp column
                Date timeStamp;
                try
                {
                    timeStamp = dateFormat.parse(columns[1]);
                }
                catch (ParseException e)
                {
                    System.err.println("Could not parse time stamp: " + columns[1]);
                    timeStamp = null;
                }
                // in or out column
                String punchInOrOut = columns[2];
                timePunches.add(new TimeClock(employeeID, timeStamp, punchInOrOut));

                line = in.readLine();
            }
        }
        catch(IOException e)
        {
            System.out.println(e);
            return null;
        }
    }
    return timePunches;
}

Thank you in advance! 先感谢您!

The lines if(timePunches.contains("i")) and if(timePunches.contains(employeeID)) won't work since timePunches is an arrayList of TimeClock and unless you use a comparator or implement the Comparable interface, you cannot check if it contains a String value or an Employee value. 由于timePunchesTimeClock的arrayList,因此if(timePunches.contains("i"))if(timePunches.contains(employeeID))行将不起作用,除非您使用比较器或实现Comparable接口,否则无法检查它包含一个String值或一个Employee值。

As I can assume in your code, you add timePunches to the end of the file so you only need to compare to the last item of your ArrayList to see if the current employee's state is punched in or punched out. 正如我在您的代码中所假设的那样,您将timePunches添加到文件的末尾,因此您只需要与ArrayList的最后一项进行比较,以查看当前员工的状态是否被打入或打出。

Instead of if(timePunches.contains("i")) and if(timePunches.contains(employeeID)) you should first fill your ArrayList only with your current Employee punches. 代替if(timePunches.contains("i"))if(timePunches.contains(employeeID))您应该首先仅使用当前的Employee打孔填充ArrayList。 Then, do something similar to: 然后,执行类似的操作:

if((timePunches.get(timePunches.size()).getPunchedInOrOut.equals("i") && choice.equals("o")) || (timePunches.get(timePunches.size()).getPunchedInOrOut.equals("o") && choice.equals("i")) ... if((timePunches.get(timePunches.size()).getPunchedInOrOut.equals("i") && choice.equals("o")) || (timePunches.get(timePunches.size()).getPunchedInOrOut.equals("o") && choice.equals("i")) ...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将用户和密码输入与文本文件进行比较? - How can I compare User and password input to a text file? 如何读取 csv 文本文件,以便将 csv 文件中的特定值与用户输入进行比较? - How do I read csv text file so I can compare specific values from csv file with user input? 如何将用户输入从 JTextfield 添加到文本文件 - How do I add user input from JTextfield to Text file 如何在Java中将用户输入的字符与字典文件进行比较? - How to compare character input by user to dictionary file in Java? 你如何从文件中的文本中比较 char[] 数组(输入)? - How do you compare char[] array (input) from the text in file? 如何将用户字符串输入与整个数组中的字符串进行比较? - How do I compare user string input to the string in an entire array? 如何验证 Java 中的用户输入 - How do I validate user input in Java 用户输入Java中的文本文件 - User input into a text file in java 尝试将用户输入与文本文件进行比较,然后从Java上的该点读取数字值 - trying to compare user input with a text file and then read the values of numbers from that point on java 如何将要求用户输入的变量与用户输入进行比较? - How do I compare a variable that asks for user input to the user's input?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM