Java-如何在两个字符之间进行随机猜测?

时间:2018-07-30 18:23:37

标签: java

我是Java的初学者,正在努力制作一个简单的纸牌游戏,您可以在值“ red”和“ black”之间进行选择。谁能看到什么问题?

String guess;
Scanner keyboard = new Scanner(System.in);

Random r = new Random();
char answear = r.nextBoolean() ? 'R' : 'B';
String s = String.valueOf(answear);

do {
    System.out.println("Guess the color of the card - (R)ed or (B)lack?");
    guess = keyboard.next();
    if (guess == s)
        System.out.println("Correct");
    else
        System.out.println("Wrong");
} while (guess != s);

3 个答案:

答案 0 :(得分:3)

在Java中,当比较对象时,字符串是一个对象:

  

==测试引用是否相等(它们是否是同一对象)。

     

.equals()测试值相等性(是否在逻辑上   “等于”)。

这在How do I compare strings in Java?

中有进一步的解释

另一方面,char是原始数据类型,在原始类型==上测试值相等性。 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

编辑-关于大小写:

在Java中,无论字符串的大小写(小写或大写),您都有方法“ equalsIgnoreCase”来比较两个字符串。如果参数不为null,则此方法返回true,并且它表示忽略大小写的等效String,否则返回false。

答案 1 :(得分:1)

因此,您在这里遇到了几个问题:

String guess;
Scanner keyboard = new Scanner(System.in);

Random r = new Random();
char answear = r.nextBoolean() ? 'R' : 'B';
String s = String.valueOf(answear);

do {
    System.out.println("Guess the color of the card - (R)ed or (B)lack?");
    guess = keyboard.next();
    //The problem is that you're using reference comparison, but that's not the only issue you 'will have', you're only checking raw input vs upper case 'R' 
    //and 'B' so you 'need' (you can handle this with lower case or alternative, too) to change this to `.toUppercase()`.
    if (guess == s)
        System.out.println("Correct");
    else
        System.out.println("Wrong");
//The same problem is happening here:
} while (guess != s);

新代码:

String guess;
Scanner keyboard = new Scanner(System.in);

Random r = new Random();
char answear = r.nextBoolean() ? 'R' : 'B';
String s = String.valueOf(answear);

do {
    System.out.println("Guess the color of the card - (R)ed or (B)lack?");
    guess = keyboard.next();
    if (guess.toUpperCase().equals(s))
        System.out.println("Correct");
    else
        System.out.println("Wrong");
} while (!guess.toUpperCase().equals(s));}

使用==时,您正在比较参考。

要比较文本(字符串类型),应使用.equals()

由于r不等于R,因此您还应确保满足大写/小写的情况,以防止出错。

答案 2 :(得分:-1)

基本上,不要对字符串使用==,这仅适用于原始数据类型或基本上不是对象的任何内容。因为这指向字符串的引用并比较它们是否相等(基本上测试它们是否是相同的变量,而不是相同的字符串内容。对于字符串,要使用.equals(),通常我将像这样的ToUpperCase()语句:

if(guess.toUpperCase().equals(s.toUpperCase()))

摆脱区分大小写的原因,因为它只是使每个人的生活更轻松,但我知道那不是问题的一部分

tldr:在比较字符串时使用.equals,否则它指向字符串的对象而不是内容。