- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用java编写这个程序。
我可以从构造函数中读取字符串并使用分隔符分隔字符串。但是,每次我尝试为这些值调用诸如 promote()
之类的方法时,该值都保持不变。 boolean 方法 promote()
显示 true
,但级别并没有增加。
例如:如果构造函数中的字符串是:"Harry#wizard#broom"
,则:
name <- "Harry"
level <- "wizard"
supplies <- "broom"
name
、level
和 broom
都是私有(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/
我正在尝试将 Heroku 上的 dyno 类型从“爱好”更改为“免费”。是否可以? 当我单击“更改 Dyno 类型”时,会出现一个对话框,但它没有“免费”选项。 最佳答案 目标是将 Dyno 层切换
为我的 ClickOnce 应用程序的用户提供降级到以前版本的方法的推荐方法是什么? (以防新版本不能在他们的机器上运行) 最佳答案 在 ClickOnce 部署设置中,将最低要求版本保留为旧版本。这
当我跑 dotnet restore (或在 Visual Studio 中运行包还原),我看到如下警告: /usr/local/share/dotnet/sdk/1.0.4/NuGet.target
我网站的某些页面出现 502 错误,我不明白为什么有些页面可以工作,但其他页面却显示此错误: Request Method:POST Status Code:502 Bad Gateway Refer
我创建了一个具有Docker支持的ASP CORE 1.1项目。它运行。 现在,当我将其降级为ASP Core 1.0并运行docker模式时,我得到了 The target process exit
我网站的某些页面出现 502 错误,我不明白为什么有些页面可以工作,但其他页面却显示此错误: Request Method:POST Status Code:502 Bad Gateway Refer
我有一个 React 应用,可让用户使用 Firebase 身份验证通过 Google 登录。 我成功登录 Google,它显示了我的个人资料图片。 然后,我从 Firebase 身份验证中删除了该帐
我在一个包里有这个: api.use([ 'kestanous:herald@1.1.3', 'kestanous:herald-email', ]); 正如预期的那样,Met
我在 RPi2 上的 Raspbian 上运行 ownCloud 安装,我刚刚运行: apt-get update apt-get dist-upgrade 现在,当我尝试在浏览器中访问我的 ownC
我一直在 git 分支上切换到 1.13.2 版本的 ember,现在我想在返回另一个分支时回到 1.11.1。 我一直在运行npm install和 bower install没有失败。 但是当我运
是否可以在周期结束时而不是立即降级用户?我梳理了API Docs但一直无法弄清楚如何实现这一点。 作为解决方法,我目前立即取消用户的订阅,然后为他们订阅较少的订阅,试用到月底。但这是行不通的 - 我需
我们的应用服务有免费和付费计划。用户可以将免费计划升级到付费计划,但我们提供“降级”到免费计划的可能性。在发布商门户上,免费计划可以从付费计划迁移,付费计划也可以从免费计划迁移。 但是在 Azure
我们的应用服务有免费和付费计划。用户可以将免费计划升级到付费计划,但我们提供“降级”到免费计划的可能性。在发布商门户上,免费计划可以从付费计划迁移,付费计划也可以从免费计划迁移。 但是在 Azure
我们开发了一个通过 Windows Installer 分发的应用程序,它是使用 WiX 创建的,我们的客户可以在其中从任何旧版本升级到最新版本。 然而,我们的最新版本删除了 2 个 dll,这只能通
我收到有关“软件包降级”的构建错误,例如: NU1605 Detected package downgrade: Microsoft.Extensions.Configuration.Json fr
我终于设法通过 dotnet restore 下载了一个项目的依赖项,经过全部清除过程后nuget缓存,dnx缓存,并更新 cli使用测试版 channel 。 但是使用 project.json下面
我们在 Azure VM 上的 2 个独立 Ultra 磁盘上有 tempdb 和日志文件。由于使用率不是那么高,我们希望将它们降级为高级 SSD。是否可以这样做,或者我们必须连接新的 SSD,将文件
我正在尝试用java编写这个程序。 我可以从构造函数中读取字符串并使用分隔符分隔字符串。但是,每次我尝试为这些值调用诸如 promote() 之类的方法时,该值都保持不变。 boolean 方法 pr
我正在创建一个返回 Weak 的函数对特征对象的引用。在找不到对象的情况下(它是一个查找函数),我想返回一个空的 Weak引用使用 Weak::new() : use std::rc::{self,
我试图更喜欢来自 CondaForge 的包(为了可用性和兼容性)。然而,Conda 似乎更喜欢来自其他 channel 的核心库版本(例如 NumPy)。 例如,当我尝试安装一个新库时,Conda
我是一名优秀的程序员,十分优秀!