选择哈希集中的第二个单词并将其转换为字符串? Java的

时间:2016-11-04 18:46:55

标签: java string arraylist hashmap hashset

我正在制作一个基于文本的RPG,我想实现一个通用命令“use”,它将激活一个项目的效果(装备武器/饮料药水/发射烟火)。所有这些都准备好了方法通知。但是我需要通过HashSet通过String选择特定项,而不使用.contains。

这是我的InputReader类

import java.util.HashSet;
import java.util.Scanner;

public class InputReader
{
    private Scanner reader;

    /**
     * Create a new InputReader that reads text from the text terminal.
     */
    public InputReader()
    {
        reader = new Scanner(System.in);
    }

    /**
     * Read a line of text from standard input (the text terminal),
     * and return it as a set of words.
     *
     * @return  A set of Strings, where each String is one of the
     *          words typed by the user
     */
    public HashSet<String> getInput()
    {
        System.out.print("> ");                // print prompt
        String inputLine = reader.nextLine().trim().toLowerCase();

        String[] wordArray = inputLine.split(" ");  // split at spaces

        // add words from array into hashset
        HashSet<String> words = new HashSet<String>();
        for(String word : wordArray) {
            words.add(word);
        }
        return words;
    }
}

这是我开始制作RPG的方法。

public void startBattle() {
        printWelcomeMessage();
        boolean finished = false;

        while(!finished && monsters.size() > 0) {
        HashSet<String> commands = reader.getInput();

        if(commands.contains("use"))
         {
// Use an item by name after the word "use" else print "didn't specify item"
         }

我已经尝试了很多方法作为不同格式的ArrayLists的流(我不知道如何使用)。我怎么能简单地把所有这些单词,把它们粘贴到一个ArrayList中,然后在我的Player类中使用这个方法迭代检查我可能拥有的项目(如果它找到一个项目也停止,我不想让它使用它一次在字符串中找到的每一个项目:

public Item findItem(String search) {
        return this.items.get(search);
    }

项目是HashMap格式的播放器库存

2 个答案:

答案 0 :(得分:0)

如前所述:摆脱HashSet。它不会帮助你。正如shomsel已经指出的那样,Set没有被订购的事实使得它成为你的问题的不好选择。

您收到的每个输入都由一串字符组成。这些字符形成标记 - 例如,您使用空格作为分隔符,它只是流中的一个cartein标记。这些令牌是语言的词 - 你确实在这里处理一种语言 - 你想要建立。

首先,您需要一个标记器:一些软件可以将字符流转换为标记流。您已经实现了分隔符令牌的处理:

String[] wordArray = inputLine.split(" ");  // split at spaces

现在你必须实现解析存储在String-Array中的标记。这是一个更难的部分。

如果在您的令牌流中的正确上下文中使用了此单词,您将迭代这些单词并决定。简单地说:您需要进行某种语法检查。

在确定您已经收到了必须构建的语法正确的令牌/单词流之后 - 例如 - 执行令牌流所描述的所需操作的决策树。我想这将是最困难的部分。

我建议你看一下Antlr:http://www.antlr.org/

它是构建词法分析器/解析器的工具,对于这个问题可能是很好用的。

祝你好运

亚历

答案 1 :(得分:0)

让我们首先看一下,在您的情况下使用HashSet是完全错误的,因为它不会保留顺序。
简单的例子:

    Set<String> set = new HashSet<>();

    set.add("use");
    set.add("zebra");

    System.out.println(set);
    // [zebra, use]

这显然不是你想要的。

我建议使用队列:

    Queue<String> words = new LinkedList<>();

    words.add("some");
    words.add("junk");
    words.add("use");
    words.add("zebra");
    words.add("Run");
    words.add("away");


    while(!words.isEmpty()) {

        String word = words.poll();

        if ("use".equalsIgnoreCase(word)) {
            String subject = words.poll();

            System.out.println(String.format("Using %s", subject));
            break; //This will leave your current loop
        }
    }

    System.out.println("Left to do " + words.toString());