当前位置: 首页 > 知识库问答 >
问题:

Java:扫描程序/阵列列表类型有问题

太叔志文
2023-03-14

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

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

如果可能的话,我认为如果我将一个项目传递给开关(基于用户输入),而不是一个字符串,而我后来必须“翻译”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个答案

高晋
2023-03-14

表达式的类型必须是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

这意味着您无法将项目本身传递到交换机。然而,如果你想拥有可读的代码,可能是对你的其他团队成员来说,如果你是在一个团队中工作,那么你可以使用hashmap和enum来进行切换。

例如:

public enum ItemChoice {
    SWORD, WAND, CAT
}

然后是hashmap

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

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

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

然后您可以很容易地从用户输入中获得枚举值,然后在交换机中使用它。它比您当前检查字符串的方法更广泛,但它更具可读性,您可以称之为“更干净”

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

case "testwand":
case "test wand":

但你只需要一个案子

case "testwand":

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

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

对未来的一个建议是,你可能想创建一个玩家对象,这样你就可以在玩家对象中保存数组列表,而不是静态变量。此外,它还允许你更容易地保存玩家的数据,比如玩家的钱数、杀戮次数、等级数等...最好坚持面向对象的编程。

例如,你会:

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.getInventory();
 类似资料:
  • 问题内容: 我想知道从ArrayList转换为Array是否安全/建议?我有一个文本文件,每行一个字符串: 我想将它们读入数组列表,然后将其转换为数组。建议这样做/合法吗? 谢谢 问题答案: 是的,将转换为是安全的。一个好主意取决于您的预期用途。您需要提供的操作吗?如果是这样,请将其保留为。否则转换掉! 输出

  • 我使用jSerialComm库和扫描仪类。当我尝试运行我的程序时,我得到以下错误: 线程“main”中出现异常Java . lang . nullpointerexception < br >位于java.io.Reader .(未知源)< br >位于java.io.InputStreamReader .(未知源)< br >位于java.util.Scanner .(未知源)< br >位于s

  • 问题内容: 如何将扫描仪的定界符设置为;或换行? 我试过: 但这不起作用。 问题答案: 通常,在模式中,您需要将翻倍。 所以,尝试 要么 编辑 :如果是问题,则可能要尝试以下操作: 它匹配的一个或多个,和。 注意 :我还没有尝试过这些。

  • 问题内容: 我正在尝试读取具有多个单词的字符串,即。洛杉矶或纽约市。如果有两个词并将它们分割在变量之间,则使用scanner.next()进行“出发”和“到达”只会读取第一个。nextLine()也不是很幸运。这是我的代码: 我知道这很简单,但我还没有弄清楚。 这是上面的代码的输入/输出: 输入航班号:29 输入出发城市:(立即跳至下一行) 输入到达城市: -—我真正想要的是---- 输入航班号:

  • 问题内容: 我正在使用嵌套循环从字符串行(从文本文件)中提取数字,如下所示: 问题在于此代码将跳过所有空格,但是我也需要使用这些“空格”。那么可以返回空格还是我需要使用其他东西? 我的文本文件可能包含以下内容: 这些空白行各包含1条,这就是我需要返回的行。 问题答案: 使用扫描仪和方法,您将找到解决方案,因为这将使您能够捕获空白行或空白行。

  • 根据这个文档,DynamoDB支持map(M)和list(L)类型,但是当我试图创建一个具有(L)类型的表时,我得到一个错误: ValidationException(客户端):检测到1个验证错误:attributeDefinitions处的值“L”。2.member.attributeType未能满足约束:成员必须满足枚举值集:[B,N,S] 将属性添加到表信息后发生此情况: 我的目标是为存储一