使用从扫描仪中取出的字符串不起作用?

时间:2010-10-27 01:59:23

标签: java java.util.scanner

当我运行程序并输入等级&性别它对我大吼大叫,告诉我这是一个无效的性别。我不明白为什么如果我将“男性”输入控制台,它不等于字符串“男性”?请告诉我为什么这不起作用,也许有一些关于如何解决它的建议?谢谢!

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class BabyNames {

public static void main(String[] args) throws IOException {
    Scanner input = new Scanner(System.in);
    System.out.print("Enter male or female: ");
    String gender1 = input.next();
    System.out.print("Enter rank: ");
    int rank = input.nextInt();         
    while (!(gender1 == "female" || gender1 == "male")){
            System.out.println("Please try again with a valid gender.");
            System.out.println("");
            System.out.println("Enter male or female: ");
            gender1 = input.next();
        }
    while (rank <= 0 || rank > 1000){
        System.out.println("Please try again with a valid rank.");
        System.out.println("");
        System.out.println("Enter rank: ");
        rank = input.nextInt();
    }

    findRank(gender1, rank);
}

public static void findRank(String gender2, int rank) throws IOException {
    File babyNames = new File("/home/skatty14/Downloads/BabyNames.txt");
    Scanner input = new Scanner(babyNames);
    int rankCount = 0;
    while (input.hasNextLine()){
        rankCount++;
        System.out.println(rankCount);
        if (gender2 == "male"){
            String name = input.next();
            System.out.println(name);
        }
        if (gender2 == "female"){
            String name = input.next();
            System.out.println(name);
        }
      }
   }
}

3 个答案:

答案 0 :(得分:4)

要比较Strings,您需要使用.equals(),因此请将所有字符串比较更改为==,以改为使用.equals()

if(gender1 == "male") { ... }

会变成,

if(gender1.equals("male")) { ... }

等等。

答案 1 :(得分:1)

'=='运算符测试对字符串的引用的等效性,而不是字符串的内容,因此为什么你的代码没有给你预期的结果。

尝试使用表单

if (gender1.equals("female"))

等。代替。

答案 2 :(得分:1)

Anthony Forloney的答案是最好的

但如果需要,可以使用String API提供的intern()函数跳过等号。

if( gender1.intern() == "male".intern() ) { ... }
  

实习生

     

public String intern()   返回字符串对象的规范表示。

     

字符串池(最初为空)由String类私有维护。

     

当调用intern方法时,如果池已经包含一个等于此String对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。

     

接下来,对于任何两个字符串s和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真。