gpt4 book ai didi

java - Java 中与字符串相关的问题 : why isn't my level promotion/downgrade updated correctly?

转载 作者:行者123 更新时间:2023-12-02 06:03:52 26 4
gpt4 key购买 nike

我正在尝试用java编写这个程序。

我可以从构造函数中读取字符串并使用分隔符分隔字符串。但是,每次我尝试为这些值调用诸如 promote() 之类的方法时,该值都保持不变。 boolean 方法 promote() 显示 true,但级别并没有增加。

例如:如果构造函数中的字符串是:"Harry#wizard#broom",则:

name <- "Harry"
level <- "wizard"
supplies <- "broom"

namelevelbroom 都是私有(private)数据实例(我不知道我是否应该使用数据实例或本地数据实例)变量)。

但是,每当我调用 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;
}

最佳答案

我会替换:

    else if (level == "shaman")
{
return false;
}
return true;

作者:

    else if (level.equals("shaman"))
{
return false;
}

System.err.println("Invalid/corrupted level name! ['" + level + "']");
return false;

确实,如果我可以改写你的算法:

if level is upgradable then
promote it
return true

if level is top level
don't do anything
return false

// we shouldn't be in this place!
// A level is either upgradable or it is the top level...
// if we are, there is some mistake in here
warn user
return false

我也会对 downgrade() 做同样的事情。

无论您是否添加错误消息,如果您实际上没有执行任何升级/降级操作,都不应该为级别升级/降级返回 true

检查意外行为并在适当时引发异常(或至少写入错误输出)通常是一个很好的做法。在这种情况下,它可能会在运行时提醒您您从未输入过任何测试,并且您可能会发现问题与字符串的相等性检查有关。

正如@Rafa El@JB Nizet在评论中所说,你不应该使用==来比较Java中的字符串。作为引用,我添加了评论中提供的链接 @JB Nizet:How do I compare strings in Java?

注意:为什么不使用枚举来存储可能的级别?这样您就知道传递给关卡对象的字符串中不会有任何错误。

public enum Level {
APPRENTICE,
WIZARD,
MAGE,
SORCERER,
SHAMAN,
}

然后:

Level level = Level.APPRENTICE;

switch (level) {
case APPRENTICE:
level = Level.WIZARD;
galleons += 100;
return true;
case ...:
...
}

此外,由于升级/降级很大程度上只是枚举中的值转换,因此您可以为该转换编写更通用的方法,因此添加/删除级别会更容易或者随着项目的发展更改它们的顺序,而无需编辑所有测试用例。

由于这一点有点偏离主题,我将保持简短。如果您遇到问题,请随时询问精度。基本上,您可以使用:

  • enum.toString()(“返回声明中包含的枚举常量的名称”),
  • 迭代enum.values()以迭代enum值,
  • enum.ordinal()(“返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量被分配零序数)。”)

除了 enum 文档之外,还有大量示例可以帮助您入门。

关于java - Java 中与字符串相关的问题 : why isn't my level promotion/downgrade updated correctly?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22448834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com