为什么这个if语句测试不起作用?

时间:2014-11-10 20:16:30

标签: java file sorting if-statement filter

我正在将用户输入与给定文件输入进行比较:Input file

如果解析的用户输入标记与解析的文件输入标记匹配,则文件输入将作为String返回。

public static String findMatch(Scanner input, String name, String gender){
    String output = "";
    boolean fileContains = false;
    String fileName = "";
    String fileGender = "";
    System.out.println("User input = " + name + " " + gender);
    while (input.hasNextLine() && (fileContains == false)) {
        String line = input.nextLine();
        Scanner scanLine = new Scanner(line);
        if(line.toUpperCase().contains(name.toUpperCase()) && line.contains(gender.toUpperCase())){
            fileName = scanLine.next();
            fileGender = scanLine.next();
            System.out.println("File input = " + fileName + " " + fileGender);
        }

        if (name.equals(fileName.toUpperCase()) && gender.equals(fileGender.toUpperCase())) {
            fileContains = true;
            System.out.println("The user input matches the file input.");
            output = line;
        }
    } 
    //exit out of while loop
    System.out.println("fileContains no longer is false.");
    System.out.println(output);
    return output;
}

有问题的if语句在这里:

        if (name.equals(fileName.toUpperCase()) && gender.equals(fileGender.toUpperCase())) {
            fileContains = true;
            System.out.println("The user input matches the file input.");
            output = line;
        }

如何获得参数名称和性别:

public static void main(String[] args){
    Scanner input = new Scanner(new File("names.txt"));
    Scanner console = new Scanner(System.in);
    String name = getName(console);
    String gender = getGender(console);
    String check = find(input, name, gender);
}
public static String getName(Scanner console) {
    System.out.print("name? ");
    return console.next();
}

public static String getGender(Scanner console) {
    System.out.print("gender (M or F)? ");
    return console.next();
}

我尝试打印文件输入和用户输入,它们都明显相同。我不确定它为什么不起作用。

用户输入:Jane F

预期输出:

用户输入= Jane F

文件输入= Janette F

文件输入= Janessa F

文件输入= Maryjane F

文件输入= Anjanette F

文件输入= Janeen F

文件输入= Janell F

文件输入= Jane F

用户输入与文件输入匹配。

fileContains不再是假的。

Jane F 98 108 128 116 48 55 47 39 67 202 312 345 436 384

实际输出

用户输入= Jane F

文件输入= Janette F

文件输入= Janessa F

文件输入= Maryjane F

文件输入= Anjanette F

文件输入= Janeen F

文件输入= Janell F

文件输入= Jane F

文件输入= Janey F

文件输入= Janelle F

文件输入= Janel F

文件输入= Janene F

文件输入=珍妮特F

fileContains不再是假的。

3 个答案:

答案 0 :(得分:1)

取代name.equals(fileName.toUpperCase()),您应该使用name.equals(fileName)name.equalsIgnoreCase(fileName),具体取决于您的需求。 gender也是如此。

答案 1 :(得分:0)

问题在于你调用它的方式,或者你传递的参数。您发布的方法效果很好。

这是我刚编译并运行的整个文件:

package jah.tests.stackoverflow;

import java.util.Scanner;

public class FileRead {

    public static String findMatch(Scanner input, String name, String gender) {
        String output = "";
        boolean fileContains = false;
        String fileName = "";
        String fileGender = "";
        System.out.println("User input = " + name + " " + gender);
        while (input.hasNextLine() && (fileContains == false)) {
            String line = input.nextLine();
            Scanner scanLine = new Scanner(line);
            if (line.toUpperCase().contains(name.toUpperCase())
                    && line.contains(gender.toUpperCase())) {
                fileName = scanLine.next();
                fileGender = scanLine.next();
                System.out.println("File input = " + fileName + " "
                        + fileGender);
            }

            if (name.equals(fileName.toUpperCase())
                    && gender.equals(fileGender.toUpperCase())) {
                fileContains = true;
                System.out.println("The user input matches the file input.");
                output = line;
            }
        }
        // exit out of while loop
        System.out.println("fileContains no longer is false.");
        System.out.println(output);
        return output;
    }

    public static void main(String[] args) {
        findMatch(new Scanner("names.txt"), "Randall", "M");
    }

}

它给了我这个输出:

User input = Randall M
fileContains no longer is false.

请注意,我的代码中没有更改任何内容。

如果我将最后一位改为

findMatch(new Scanner("names.txt"), "Jane", "F");

然后这也有效:

User input = Jane F
fileContains no longer is false.

答案 2 :(得分:0)

这条线看起来很可疑。您正在比较line.toUpperCase()名称,但不会比较性别。

if(line.toUpperCase().contains(name.toUpperCase()) && 
   line.contains(gender.toUpperCase()))

你的意思是?

if(line.toUpperCase().contains(name.toUpperCase()) && 
   line.toUpperCase().contains(gender.toUpperCase()))