Java中与字符串相关的问题:为什么我的级别提升/降级没有正确更新?
我正试图用java编写这个程序
我可以从构造函数中读取字符串,并使用分隔符分隔字符串。但是,每次我尝试为这些值调用promote()
等方法时,值都保持不变。布尔方法promote()
显示true
,但级别没有增加
例如:如果构造函数中的字符串为:"Harry#wizard#broom"
,则:
name <- "Harry"
level <- "wizard"
supplies <- "broom"
name
、level
和broom
都是私有数据实例(我不知道应该使用数据实例还是局部变量)
但是,每当我调用harry.promote()
时,它都返回true
,但级别保持不变,不会得到提升。level
中的初始值似乎覆盖了它
我编写了以下代码:
import java.util.Scanner;
import java.io.*;
public class Magician
{
private String name;
private String level;
private String supplies;
private double health;
private int galleons;
public Magician(String phrase) //phrase will be sth like this: Harry#wizard#broom#staff
{
health = 4000;
galleons = 200;
Scanner firstScan = new Scanner(details);
firstScan.useDelimiter("#");
name = firstScan.next();
level = firstScan.next();
if (firstScan.hasNext())
{
supplies = firstScan.next();
while (firstScan.hasNext())
{
supplies = supplies + " " + firstScan.next();
}
}
else
{
supplies ="";
}
}
public String getName()
{
return name;
}
public String getLevel()
{
return level;
}
public int getGalleons()
{
return galleons;
}
public double getHealth()
{
return health;
}
public String getSupplies()
{
return supplies;
}
//Mutators
public void setName(String nameUpdate)
{
name = nameUpdate;
}
public void setLevel(String levelUpdate)
{
level =levelUpdate;
}
public void setGalleons(int galleonsUpdate)
{
galleons = galleonsUpdate;
}
public void setHealth(double healthUpdate)
{
health = healthUpdate;
}
public void setSupplies(String suppliesUpdate)
{
supplies = suppliesUpdate;
}
// boolean promote, promotes a level up
public boolean promote()
{
if (level == "apprentice")
{
level = "wizard";
galleons +=100;
return true;
}
else if (level == "wizard")
{
level = "mage";
galleons +=100;
return true;
}
else if (level == "mage")
{
level = "sorcerer";
galleons +=100;
return true;
}
else if (level == "sorcerer")
{
level = "shaman";
galleons +=100;
return true;
}
else if (level == "shaman")
{
return false;
}
return true;
}
public boolean downgradeLevel()
{
if (level == "shaman")
{
level = "sorcerer";
return true;
}
else if (level == "sorcerer")
{
level = "mage";
return true;
}
else if (level == "mage")
{
level = "wizard";
return true;
}
else if (level == "wizard")
{
level = "apprentice";
return true;
}
else if (level == "apprentice")
{
return false;
}
if(galleons>= 100)
{
galleons -=100;
}
else
{
galleons =0;
}
return true;
}
# 1 楼答案
我将替换:
作者:
事实上,如果我能重新表述你的算法:
我也会为
downgrade()
做同样的事情无论是否添加错误消息,如果您实际上没有执行任何升级/降级操作,则不应为级别升级/降级返回
true
检查意外行为并在适当时引发异常(或至少写入错误输出)通常是一种好的做法。在本例中,它可能会在运行时提醒您从未输入任何测试,并且您可能会发现问题与字符串的相等性检查有关
正如@rafael和@JB Nizet在评论中所述,您不应该使用
==
来比较Java中的字符串。为了便于参考,我添加了注释中提供的链接:How do I compare strings in Java?注意:为什么不使用
enum
存储可能的级别?这样,您就知道传递给级别对象的字符串中不会有任何错误然后:
此外,由于升级/降级在很大程度上只是
enum
中的一个值转移,因此您可以为该转移编写一个更通用的方法,因此随着项目的发展,添加/删除级别或更改其顺序将更容易,而无需编辑所有测试用例由于这一点有点离题,我将保持简短。如果您有问题,请随时询问精度。基本上,您可以使用:
enum.toString()
(“返回声明中包含的此枚举常量的名称”)enum.values()
以迭代enum
值enum.ordinal()
(“返回此枚举常量的序号(其在枚举声明中的位置,初始常量的序号为零)。”李>除了
enum
文档之外,还有很多示例可以帮助您入门# 2 楼答案
要改进JDeveloper的答案,可以包括一个包含所有可能提升值的列表:
您甚至可以将其折叠为单个方法(
boolean demote
然后控制level =
行)也考虑检查数组的长度,这样在推广巫师或贬低学徒时不会得到^ {< CD3>}例外:
# 3 楼答案
试试这个:-
如果需要从
main()
访问变量,则需要将该变量声明为静态变量输出:-
现在开始工作了
希望它能帮助你