Java:Scanner / ArrayList类型的问题

时间:2017-02-10 02:55:47

标签: java arraylist types

背景:我对编码很新。我正在编写一个基于文本的单人RPG作为学习方法。

所以,我有一个ArrayList,我用它来存储Item类的对象。我想根据扫描器的用户输入检查ArrayList是否存在项(来自Item类的对象)。

如果可能的话,我认为如果我将一个Item传递给开关(基于用户输入)而不是一个字符串,我以后必须“翻译”以使ArrayList与它一起使用它会更清晰。

这可能吗?或者我必须按照我在以下代码中写出的方式进行操作?或者有一种更好的,完全不同的方式去做它我不知道的吗?

public class Test{

//New Array that will store a player's items like an inventory

static ArrayList<Item> newInvTest = new ArrayList<>();

//Placing a test item into the player's inventory array
//The arguments passed in to the constructor are the item's name (as it would be displayed to the player) and number of uses

static Item testWand = new Item("Test Wand", 5);

//Method for when the player wants to interact with an item in their inventory

public static void useItem(){
    System.out.print("Which item do you wish to use?\n: ");
    Scanner scanner5 = new Scanner(System.in);
    String itemChoice = scanner5.nextLine();
    itemChoice = itemChoice.toLowerCase();
    switch (itemChoice){
        case "testwand":
        case "test wand":
        boolean has = newInvTest.contains(testWand);
        if(has == true){
            //the interaction occurs
        }else{ 
            System.out.println("You do not possess this item: " + itemChoice);
        }
    }
}

提前感谢您的回答。

1 个答案:

答案 0 :(得分:0)

  

Expression的类型必须是char,byte,short,int,Character,Byte,Short,Integer,String或枚举类型(第8.9节),否则会发生编译时错误。

来自http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.11

这意味着您无法将项目本身传递到交换机中。但是,如果您想拥有可读代码,可能是您的其他团队成员,如果您在一个小组中工作,那么您可以使用散列图和枚举进行切换。

例如:

public enum ItemChoice {
    SWORD, WAND, CAT
}

然后是hashmap

HashMap<String, ItemChoice> choice = new HashMap<String, ItemChoice>();

然后使用您期望的值加载hashmap,例如:

choice.put("Wand", ItemChoice.WAND)

然后,您可以轻松地从用户输入中获取枚举值,然后在您的开关中使用它。它比你目前检查字符串的方法更广泛,但它更具可读性,你可以称之为“更干净”。

如果您使用当前的方法,请使用字符串进行检查。然后我建议你从字符串 itemChoice 中删除“”空格,这样就不会对案例进行处理,例如:

case "testwand":
case "test wand":

但相反,你只需要一个案例

case "testwand":

这并没有真正影响任何事情,但既然你没有再次使用布尔值,那么你可以这样做

if(newInvTest.contains(testWand)){
    // the interaction occurs
    // boolean has is not needed anymore!
}

对于未来的建议,您可能想要创建一个Player对象,这样您就可以将ArrayList保存在播放器对象中,而不是静态变量。此外,它还可以让您轻松地从播放器中轻松保存数据,例如玩家拥有的金额,杀戮次数,级别编号等等......尝试坚持面向对象的编程更好。

例如,您将拥有:

public class Player {

    private ArrayList<Item> newInvTest = new ArrayList<>();

    private String name;

    private int currentLevel;

    public String getName(){
        return name
    }

    public int getCurrentLevel(){
        return currentLevel
    }

    public ArrayList<Item> getInventory(){
        return newInvTest;
    }

}

因此,如果您想获取清单,则可以引用实例变量,而不是静态变量。将这些变量分配给Player对象更有意义,因为它们属于播放器。所以你可以得到这样的清单:

player.getInventory();