在阅读了一章中的字符串方法描述后,我试图解决这个编程练习。就在这里。编写一个程序,询问用户的姓名,然后将该姓名写在显示器上,前面有"女士"或"先生",具体取决于姓名是女性还是男性。假设唯一的女性名字是
Amy
Buffy
Cathy
唯一的男性名字是
Elroy
Fred
Graham
所有其他名称都将在没有标题的情况下进行呼应。程序继续循环,直到用户在不首先键入名称的情况下点击"回车"为止。
C:>java Title
Enter a name:
Amy Johnson
Ms. Amy Johnson
Enter a name:
Fred Smith
Mr. Fred Smith
Enter a name:
Zoltan Jones
Zoltan Jones
Enter a name:
C:>
这是我的代码,我知道它错了,因为我很困惑。
import java.util.Scanner;
class titleApplier {
public static void main(String[] args) {
String name;
String male = {"Elroy" , "Fred " , " Graham"};
String females = {"Amy", "Buffy", "Cathy"};
Scanner scan = new Scanner(System.in);
while(name.hasNext()) {
System.out.println("Enter a name ");
name = scan.nextLine();
if(name.equals(male)) {
System.out.println("Mr " + male);
}
else if (name.equals(females)) {
System.out.println(" Mrs " + females);
}
else {
System.out.println(scan.nextLine());
}
}
}
}
你基本上走在了正确的轨道上,干得好!
您可以直接在if语句中引用它们,而不是将名称单独存储在String中:
if(name.equals("Elroy") || name.equals("Fred") || name.equals("Graham")) {
System.out.println("Mr " + male);
}
此外,由于您提供的是名字和姓氏,我认为您不应该使用equals方法进行匹配,而是检查名称是否包含以下名称之一:
if (name.contains("firstName"))
因为这看起来像是家庭作业,所以你自己也要为女性做一些同样的事情。如果你还有问题,请告诉我。祝你好运
程序中有很多错误需要更正。最好试一试。我使用了BufferedReader,因为Scanner类在循环中获取几个输入值时会导致一些问题。:-
import java.io.*;
import java.util.*;
class MF{
static boolean search(String arr[],String st){
for(int i=0;i<arr.length;i++){
if(arr[i].equalsIgnoreCase(st)==true)
return true;
}
return false;
}
public static void main(String args[])throws IOException{
String male[]={"Elroy","Fred","Graham"};
String fem[]={"Amy","Buffy","Cathy"};
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.println("Enter name:-");
String st=br.readLine();
if(st.equals("")==false){
StringTokenizer str=new StringTokenizer(st);
String tok=str.nextToken();
if(search(male,tok)==true)
System.out.println("Mr."+st);
if(search(fem,tok)==true)
System.out.println("Ms."+st);
}
else
break;
}
System.out.println("Program terminates.");
}
}
代码中的一些观察结果:
- 雄性和雌性应该是字符串的数组,而不仅仅是单个字符串。(即
String[] females = {"Amy", "Buffy", "Cathy"};
- 注意前导空格和尾随空格。除非调用
String.trim()
方法,否则"Fred"one_answers"Graham"永远不会通过比较 - 方法
hasNext()
没有在String类中定义;从而产生编译错误。如果您是在Eclipse之类的IDE上写这篇文章,请阅读您得到的错误并解决它们。即使对于初学者来说,这也不难 - 输入名称后,程序会提示用户。如果将代码封装在
do/while
中而不是while
循环中,这可能会更容易。这是一个偏好的问题,或者说是理所当然的。此外,通常您希望用户输入与提示显示在同一行中,因此使用System.out.print()
而不是System.out.println()
作为提示 - 当你在学习时,你应该总是用非常可控的输入来尝试你的程序。在这种情况下,您应该尝试使用单个男性名称和女性名称的程序,一旦该部分工作正常,那么您应该尝试扩展您的解决方案以处理多个名称
- 您的代码允许输入LINE(用空格分隔的单词),而不是String(没有空格的字符数组)。因此,您需要将该行拆分为标记(单词),检查第一个标记(名字)或第二个标记(姓氏),并将其与数组中的名称进行比较。否则,
equals()
方法将返回false
。这是因为"Elroy-Smith"不等于"Elroy"。您可以执行我刚才解释的操作,也可以使用其他String方法,如contains()
或startsWith()
- 您应该将标题附加到输入的名称,而不是字符串数组中的第一个名称。您的程序应该输出"Amy Smith夫人",而不是输出"Amy Smith夫人"
- 您的
while()
子句没有捕捉到这一要求:"程序继续循环,直到用户点击"回车"而不首先键入名称。"即使行的长度为零,此方法也将始终返回true。相反,仅当输入的String的长度大于零时,才使用输入的String
并循环 - 为了消除不必要的处理,您可以使用
boolean
变量来查看是否找到了名称,以便break
(退出循环)或continue
(跳到下一次迭代)
这是一个潜在的解决方案(可能不是最有效的,但对你来说很容易遵循):
public static void main(String[] args)
{
String name;
String[] males = {"Elroy", "Fred ", " Graham"};
String[] females = {"Amy", "Buffy", "Cathy"};
Scanner scan = null;
do
{
System.out.print("Enter a name: ");
scan = new Scanner(System.in);
name = scan.nextLine();
boolean found = false;
// Search all possible male names
for (String temp: males)
{
if (name.startsWith(temp))
{
System.out.println("Mr. " + name + "n");
found = true;
break; // stop looping if found
}
}
if (found) { continue; } // skip the rest of the loop if name has been found
// Search all possible female names (only if name has not been found)
for (String temp: females)
{
if (name.startsWith(temp))
{
System.out.println("Ms. " + name + "n");
found = true;
break;
}
}
if (name.length() > 0 && !found)
{
// A name was entered but it was never found
System.out.println("Unknown name entered.n");
}
} while (name.length() > 0);
scan.close();
}
输出:
Enter a name: Fred Smith
Mr. Fred Smith
Enter a name: Buffy Vampire Slayer
Ms. Buffy Vampire Slayer
Enter a name: Cathy Doe
Ms. Cathy Doe
Enter a name:
Exiting program.