Использование Java string.indexOf () для возврата различных подстрок - возможно? - PullRequest
0 голосов
/ 12 января 2012

Я пытаюсь создать простой интерпретатор.По сути, я использую этот метод для получения ключей к моему HashMap из строк в ArrayList.Существует 8 различных возможностей (8 ключевых слов), с которых может начинаться строка в HashMap.В настоящее время я использую string.indexOf("something"), чтобы найти строку ключевого слова, но, конечно, это совсем не гибко, если у меня есть более одного ключевого слова.

Все строки в ArrayList можно разбить на КОМАНДУ + (ИНСТРУКЦИИ).КОМАНДЫ отображаются на 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 ]

2 голосов
/ 13 января 2012

Похоже, что каждая строка в 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).

Если это не так, возможно, я не понял, что вы пытаетесь сказать.

Также см. 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 либо игнорируете ввод, либо используете его (может также обрабатывать нуль, если они получают ноль, когда ожидают некоторый ввод) .

0 голосов
/ 13 января 2012

Короткий ответ - нет.Возможно, вы захотите использовать String.split (), StreamTokenizer или StringTokenizer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...