2017-02-24 5 views
2

この質問は、経験豊かなプログラマーにとっては非常に複雑だとは思わないが、苦しんでいる。 私のようなJavaクラスの前に宣言した区切り文字のリストを持っている:JAVA:区切り文字のセットと同じではない文字列の次の文字のインデックスを決定する方法

public static final String DELIMITERS = ",<.>/?;:'\"[{]}\\|=+-_)(*&^%$#@!`~ \t\n"; 

を私は2つのパラメータ(開始インデックスと文字列)を受け取るメソッドを作成したいと思います。目的は、文字列を読み取って、上記の区切り文字のリストにない文字に対応する次のインデックスを返すことです。開始インデックスが負の数またはテキストの長さより大きい場合、メソッドは単に-1を返す必要があります。そうでなければ、デリミタリストにない次の文字のインデックスを返します。 これは私がこれまで持っているものです。

public static boolean isDelimiter(char c) { 
    String letter = "" + c; 
    if(DELIMITERS.contains(letter)){ 
     return true; 
    } 
    else{ 
     return false; 
    } 
} 

public static int posNextWord(int startPosition, String text) { 
    boolean isWord = false; 
    int nextWordPosition = 0; 
    if(startPosition < 0 || startPosition > (text.length()-1)){ 
     return -1; 
    } 
    else{ 
     while(isWord = false) { 
      for (int i = startPosition; i < text.length(); i++) { 
       if(!isDelimiter(text.charAt(i))){ 
        nextWordPosition = nextWordPosition + i + startPosition; 
        isWord = true; 
       } 
       else{ 
        isWord = false; 
       } 
      } 
     } 
     return nextWordPosition; 
    } 

} 

}

私はサンプルテキストとインデックスでこのプログラムを実行すると、しかし、この方法は、ちょうど数0を返します。すべてのすべてのヘルプははるかになります感謝。また、メソッドisDelimiterは、posNextWord()メソッドでの使用に必要です。

+0

'posNextWord'を呼び出す方法を教えてください。 – nhouser9

+0

' isWord = true;の後に 'break'する必要があると思います。 –

+0

本当にできません。より大きな課題の一部です。このメソッドは、ユーザが入力した行の集合の語数を決定するための第3のメソッドを作成するために、類似のメソッド(posNextDelimiter())を使用するだけです。 – JBarron

答えて

2

このコードのブロック全体が問題である:

while(isWord = false) { 
    for (int i = startPosition; i < text.length(); i++) { 
     if(!isDelimiter(text.charAt(i))){ 
      nextWordPosition = nextWordPosition + i + startPosition; 
      isWord = true; 
     } 
     else{ 
      isWord = false; 
     } 
    } 
} 
return nextWordPosition; 

まず第一に、あなたは、あなたのループの各文字を確認する1つのループを必要としています。 whileforは必要ありません。第二に、一致しない最初のものを探す場合は、charを見つけたらすぐ返すことができます。このよう

for (int i = startPosition; i < text.length(); i++) { 
    if(!isDelimiter(text.charAt(i))){ 
     return i + startPosition; 
    } 
} 
return -1; 
+0

@JBarron問題ありません、喜んで助けてください!これで問題が解決したら、upvoteとaccept =を覚えておいてください – nhouser9

1

が文書のコメントを参照してください。それが明確でない場合はお気軽にお問い合わせください:

ところで
public static boolean isDelimiter(char c) { 

    String letter = "" + c; 
    if(DELIMITERS.contains(letter)){ 
     return true; 
    } 
    //else{ this else is not needed 
     System.out.println(letter +" is not a delimiter"); 
     return false; 
    //} 
} 

public static int posNextWord(int startPosition, String text) { 

    //boolean isWord = false; not used 
    int nextWordPosition = 0; 
    if((startPosition < 0) || (startPosition > (text.length()-1))){ 
     return -1; 
    } 
    //else{ this is not needed 
    //while(isWord = false) { 

     for (int i = startPosition; i < text.length(); i++) { 

      if(!isDelimiter(text.charAt(i))){ 
       nextWordPosition = nextWordPosition + i + startPosition; 
       //isWord = true; 
       return nextWordPosition; //as Scary Wombat commented 
      } 
      //else{ 
      // isWord = false; 
      //} 

     } 
     //isWord = false; 
    //} 
    return nextWordPosition; 
    // } 

} 

:私は「見つからない」結果として0を返すために良いアイデアだとは思いません。有効な「見つかった」位置として0を返すこともできます。

関連する問題