有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中与字符串相关的问题:为什么我的级别提升/降级没有正确更新?

我正试图用java编写这个程序

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

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

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

namelevelbroom都是私有数据实例(我不知道应该使用数据实例还是局部变量)

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

共 (3) 个答案

  1. # 1 楼答案

    我将替换:

        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

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

    正如@rafael@JB Nizet在评论中所述,您不应该使用==来比较Java中的字符串。为了便于参考,我添加了注释中提供的链接:How do I compare strings in Java?

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

    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中的一个值转移,因此您可以为该转移编写一个更通用的方法,因此随着项目的发展,添加/删除级别或更改其顺序将更容易,而无需编辑所有测试用例

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

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

    除了enum文档之外,还有很多示例可以帮助您入门

  2. # 2 楼答案

    要改进JDeveloper的答案,可以包括一个包含所有可能提升值的列表:

    private String[] ranks = new String[] {
                        "Apprentice",
                        "Wizard",
                        "Mage",
                        "Sorceror",
                        "Shaman"};
    
    public boolean promote(String existingRank)  {
        // for each rank that exists
        for(int n = 0; n < ranks.size(); n++) {
            // if we find our rank, the next one should be it's promotion
            if(existingRank.equals(ranks[n])) {
                level = ranks[n + 1];
                galleons += 100;
                return true;
            }
        }
    
        // if we fail to find a promotion, it's failed
        return false;
    }
    
    public boolean demote(String existingRank) {
        for(int n = 0; n < ranks.size(); n++) {
            if(existingRank.equals(ranks[n])) {
                level = ranks[n - 1];
                galleons += 100;
                return true;
            }
        }
    
        return false;
    }
    

    您甚至可以将其折叠为单个方法(boolean demote然后控制level =行)

    也考虑检查数组的长度,这样在推广巫师或贬低学徒时不会得到^ {< CD3>}例外:

  3. # 3 楼答案

    试试这个:-

    // boolean promote, promotes a level up
        public boolean promote()
        {
            if (level.equals("apprentice"))
            {
                level = "wizard";
                galleons +=100;
                return true;
            }
            else if (level.equals("wizard"))
            {
                level = "mage";
                galleons +=100;
                return true;
            }
            else if (level.equals("mage"))
            {
                level = "sorcerer";
                galleons +=100;
                return true;
            }
            else if (level.equals("sorcerer"))
            {
                level = "shaman";
                galleons +=100;
                return true;
            }
            else if (level.equals("shaman"))
            {
                return false;
            }
            return true;
        }
    

    如果需要从main()访问变量,则需要将该变量声明为静态变量

    public static void main(String str[]){
            Magician magg=new Magician("Harry#wizard#broom#staff");
    
            System.out.println("Level before promote is ::"+level);
            magg.promote();
            System.out.println("Level after promote is::"+level);
        }
    

    输出:-

    Level before promote is ::wizard
    Level after promote is::mage
    

    现在开始工作了

    希望它能帮助你