2012-01-12 8 views
0

私は簡単なインタープリタを構築しようとしています。基本的に私はこのメソッドを使用してArrayListの文字列から私のHashMapのキーを取得しています。 HashMapの文字列で始まる8つの異なる可能性(8つのキーワード)があります。現在、私はstring.indexOf("something")を使用してキーワード文字列を検索していますが、もちろん、複数のキーワードがあると、これは柔軟ではありません。Javaのstring.indexOf()を使用して異なる部分文字列を返すことは可能ですか?

ArrayListのすべての文字列をCOMMAND +(命令)に分割することができます。 COMMANDはHashMapとそのクラスにマップされています。基本的には2段階の状況です:最初に、最初の単語/トークンをStringから取得し、残りの文字列を適切なクラスでさらに分割/トークン化する必要があります。

とにかく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"); 
     } 
    } 
} 
+0

'indexOf'はすでに返されたもの以外のものを返すように操作することはできません。あなたの入力文字列がどのようなものか分からなければ、それは不可能です - 単純な 'split()'で十分でしょうか? –

+0

あなたはJavaのRegEx機能について読んでみたいと思うかもしれません...読んで、試してみて、エラーと努力が必要ですが、確かにその仕事をしています。 – Fildor

+1

あなたは 'firstToken'を使用していないようです。説明は、要件を反映するほど明確ではありません。 –

答えて

0

短い答えはノーです。おそらく、String.split()、StreamTokenizer、またはStringTokenizerを使用したいと思うでしょう。

2

ALの各文字列のように見えるのは、単なるコマンドでもコマンドでも、コマンドの入力でもかまいません。 partsの大きさは、それ以外のparts[0]は、そのコマンドの入力コマンドと休息で、それだけで、コマンドの意味いずれかである場合

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

私はあなたがここにsplitメソッドを使用することができると思います。

はそれで検索を実行します。 Directiveが、その後

  1. 返された場合
    Directive directive = commandHash.get(parts[0]); 
    

    はその後partsの長さがちょうどdirective.execute()を行う1である場合。
  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 
    }  
} 

pubic 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が入力を無視するか、またはそれを使用してどちらかのためにあなたは、彼らが受け取った場合(もNULLを扱う可能性のあるすべての入力を持っていないときは、directive.execute(null);を行うことができます彼らが何らかの入力を期待しているときはnull)。

+0

@βнɛƨнǤʋяʋиɢありがとうございます。 ALの文字列は、すべてcommand + inputまたはcommand(ENDステートメントの場合のみ)に分解可能です。私が 'split()'メソッドを使って0と1の2つの部分( 'part [0]'、 'part [1]')を持つ配列を取得した場合、my interfaceディレクティブは 'public void execute String listString) '; 'directive.execute(input)'のためにそこに別のメソッドを追加する必要がありますか?ありがとう! – Luinithil

+0

はい、パラメータを取らない 'directive.execute()'を追加(過負荷)しても問題ありません。あるいは、既存のものを変更してヌル入力を処理することもできます。 –

+0

@ null入力を処理するために既存のものを変更したいのであれば、このメソッドで何を変更する必要がありますか?申し訳ありませんが、それはnoobの質問ですが、私は本格的にプログラミングをして2ヶ月も経たないうちにJavaを学習しています。 – Luinithil

関連する問題