使用Java string.indexOf()返回不同的子串 - 可能吗?

时间:2012-01-12 19:53:30

标签: java string arraylist

我正在尝试构建一个简单的解释器。基本上我使用此方法从HashMap中的字符串中获取ArrayList的密钥。 HashMap中的字符串可以以8种不同的可能性(8个关键字)开头。目前我正在使用string.indexOf("something")来查找关键字字符串,但是当我拥有多个关键字时,这当然不灵活。

ArrayList中的所有字符串都可以分解为命令+(INSTRUCTIONS)。 COMMANDS映射到HashMap及其类。所以基本上它是一个两步的情况:第一次通过我需要从字符串中获取第一个单词/标记,然后字符串的其余部分最好在适当的类中进一步分割/标记化。

无论如何,string.indexOf()可以以某种方式被操纵以返回多个子字符串的索引吗?或者我是否必须寻找其他方法?请指教。

代码如下所示:

public void parseCommands() {
    List<String> myString = new ArrayList<String>();
    myString.add(new String("# A TPL HELLO WORLD PROGRAM"));
    myString.add(new String("# xxx"));
    myString.add(new String("STRING myString"));
    //myString.add(new String("LET myString= \"HELLO WORLD\""));
    //myString.add(new String("PRINTLN myString"));
    myString.add(new String("PRINTLN HELLO WORLD"));
    myString.add(new String("END"));

    System.out.println();
    for (String listString : myString)//iterate across arraylist
    {
        if (listString.startsWith("#", 0))//ignore comments starting with #
        {
            continue;
        }

        int firstToken = listString.indexOf("END");
        String command = listString;


        Directive directive = commandHash.get(command);
        if (directive != null) {
            directive.execute(listString);
        } else {
            System.out.println("No mapped command given");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

看起来AL中的每个字符串可以只是命令或命令以及命令的输入。

我认为你可以在这里使用split方法:

String[] parts = listString.split(" ");

如果parts的大小是一个,这意味着它只是一个命令,否则parts[0]是一个命令,其余的是该命令的输入。

用它进​​行查找:

Directive directive = commandHash.get(parts[0]);

然后,如果返回Directive,那么

  1. 如果parts的长度为1,则执行directive.execute()
  2. 否则,请与parts的其余部分一起形成输入并执行directive.execute(input)
  3. 如果情况并非如此,也许我没有得到你想说的话。

    另外,请参阅String,它有各种方法可以在这里使用。

    <强>更新

    public interface Directive {    
        void execute(String input);
    }
    
    public class EndDirective implements Directive {
        @Override
        public void execute(String input) {
            // input will be neglected here
            // just do whatever you supposed to do
        }    
    }
    
    public class PrintlnDirective implements Directive {
        @Override
        public void execute(String input) {
            // input will be used here        
            // you might want to check if the input is null here
            // and write the code accordingly
            System.out.println(input);
        }    
    }
    

    有了这个,当你没有任何输入时你可以directive.execute(null);,因为你们各自的Directive要么忽略输入要么使用它(如果它们是空的话,它们也可以处理null期待一些输入。)

答案 1 :(得分:0)

简短的回答是否定的。您可能希望使用String.split(),StreamTokenizer或StringTokenizer。