我正在创建的程序的一部分需要检查是否已将相同的字符串(表示产品的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);
答案 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