将字符串传递给布尔函数以扫描文件以查找相同的字符串

时间:2017-11-09 02:22:37

标签: java boolean java.util.scanner bufferedreader filereader

我正在创建的程序的一部分需要检查是否已将相同的字符串(表示产品的ID代码)写入文本文件。这是为了停止两次写入相同的ID。

我正在使用一个布尔方法,该方法从GUI用户输入传入一个字符串,然后将其与文件中每个已存在的行进行比较。

方法如下。

public boolean hasIDAlreadyBeenUsed(String IDBeingTested) {
        boolean Decision = false;
        String ID = "Product ID: "+IDBeingTested;
        BufferedReader theBR;
        Scanner scanner;
        String scannedString;
        try {
            theBR = new BufferedReader(new FileReader("ProductData.txt"));
            scanner = new Scanner(new File("ProductData.txt"));

            while (scanner.hasNextLine()) {
                scannedString = scanner.nextLine();

                String character = scanner.findInLine(ID);


                if ((character) == (ID)) {
                    Decision = true;
                    System.out.println("they are a match: " + ID);

                } else {
                    Decision = false;
                }
            }
            theBR.close();
            theBR = null;
        } catch (IOException ioe) {
            Decision = false;
            System.out.println(ioe);
        }

        return Decision;
    } 

如果布尔值返回false,则数据将被写入文件,如果返回true,则会显示错误消息,并且不会写入任何数据。

下面是依赖于布尔输出的代码。

private void jAddProductToDatabseButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                           


        if (!product.hasIDAlreadyBeenUsed(jProductIDTextField.getText())) {
            try {
                BufferedWriter ProductFileWriter = new BufferedWriter(new FileWriter("ProductData.txt", true));

                ProductFileWriter.write("Product Name: " + jProductNameTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product ID: " + jProductIDTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Weight: " + jProductWeightTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Selling Price (£): " + jProductSellingPriceTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Image File Name: " + jNameOfImageFileTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Manufacturer Address: " + jManufacturerAddressTextArea.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Type: " + jProductTypeTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Unit Cost: " + jProductUnitCostTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Delivery Time: " + jProductDeliveryTimeTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Shelf Life: " + jProductShelfLifeTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("Product Stock Level: " + jInitialStockLevelTextField.getText() + System.getProperty("line.separator"));
                ProductFileWriter.write("==============================" + System.getProperty("line.separator"));
                ProductFileWriter.flush();
                ProductFileWriter.close();
                ProductFileWriter = null;
            }
            catch (IOException ioe) {}

        } 
        else {

            JOptionPane.showMessageDialog(null, "Cannot input, ID HAS ALREADY BEEN USED", "Incorrect ID", JOptionPane.ERROR_MESSAGE);
        }
    }

然而,即使多次输入相同的数字,例如44作为ID,也永远不会执行else语句。

我甚至在里面用这个来表明字符串是一样的。并且两次生成相同的字符串。

while (scanner.hasNextLine()) {
            scannedString = scanner.nextLine();

            String character = scanner.findInLine(ID);
            System.out.println(scannedString);
            System.out.println("Product ID: " + ID);

4 个答案:

答案 0 :(得分:0)

似乎错误来自这句话:

if ((character) == (ID)) {

比较String对象是否相同。

使用以下内容:

if (character.equals(ID)){

应该比较字符串的值。

答案 1 :(得分:0)

首先,您使用的是Scanner和BufferedReader,在您的情况下可以使用,但两者都不是解决您的问题所必需的。 您可以尝试使用类似的代码段。

public static boolean hasIDAlreadyBeenUsed(String IDBeingTested) throws IOException {
        boolean Decision = false;
        String ID = "Product ID: "+IDBeingTested;
        BufferedReader theBR = null;
        String scannedString;
        try {
            theBR = new BufferedReader(new FileReader("ProductData.txt"));

            while ((scannedString=theBR.readLine())!=null) {
                if(!Decision)
                    Decision = scannedString.contains(ID);
                else
                    break;
            }
        } finally {
            theBR.close();
        }

        return Decision;
    }

同样是我想提供的一个提示,不要用大写字母开始变量名称(通常Classes的首字母大写)。您可以参考一些在线教程以获得良好的编程实践。 欢呼声,

答案 2 :(得分:0)

您必须在找到匹配后中断循环,否则将覆盖exp_month.padStart is not a function下一行的值。

Decision

此外,我认为你不需要findInLine方法。我想这会解决你的问题。根据您的项目结构使用文件路径。

注意::如果我们遵循代码中的命名约定,那就太好了。

答案 3 :(得分:0)

在hasIDAlreadyBeenUsed()方法中将比较代码更改为以下内容:

SELECT IF(register_user_type='E', emp.col1, cust.col1), 
       IF(register_user_type='E', emp.col2, cust.col2)
FROM register_user AS user
JOIN employee AS emp ON emp.employee_id = user.register_user_id
JOIN customer AS cust ON cust.employee_id = emp.employee_id