我是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);
答案 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,否则它指向字符串的对象而不是内容。