2016-01-25 23 views
6

最初の投稿とそのすべて。私は初心者のプログラマーです。文章中の単語を検索

とにかく、私は文と単語の形でユーザの入力になりますJavaでプログラムを作成する使命を帯びました。プログラムは、文章から空白を削除し、単語が「空白なし」文に含まれているかどうかをチェックします。しかし、プログラムはまた、単語の末尾にある文字を削除し、が空白でない文にという単語が存在するかどうかをチェックします。削除する文字がなくなるまで、単語から文字を削除し続けます。また

、プログラムはまた、単語の場所を述べることになっているが、それは一つの場所を複数回リストすることはできません。プログラムが単語全体を見つけることができない場合、 "'Word'が見つかりませんでした。そうである場合、それはプリントアウト

例えば「『ワード』 『X』の位置で発見されました」私の文章は、「彼女は川で歌う」と言葉で「バイト」で、コードは「バイト」、「BYT」、「によって」、および「B」のための「shesingsbytheriver」をチェックすることになっているが、それは見つけることができない場合には"byt"、 "by"、 "b"を同じ場所に表示します。以下は

私が持っているコードです。私のif文まではすべてが正常です。空白が少ない文章で単語を見つけるのではなく、「Wordが見つかりませんでした」という文章が引き続き印刷されます。

いくつかの最後の注意:私は配列を避けるべきで、私が必要とするコマンドのほとんどはStringクラスです。

ありがとうございます!

// The purpose of this program is to take in user input in the form 
// of a sentence and a word. The program repeats the sentence and word 
// back, removes the spaces, and checks if the word was present in the 
// sentence. The program removes a letter from the word, checks if that 
// "word" is present and continues until it cannot remove any more letters. 

import java.util.*; 
import javax.swing.JOptionPane; 

public class Program1 { 

    public static void main(String[] args) { 
     String sentenceBlankless; 

     String sentence = JOptionPane.showInputDialog("Please enter a sentence: "); 
     String word = JOptionPane.showInputDialog("Please enter a word: "); 

     sentenceBlankless = sentence.replaceAll(" ", ""); 

     JOptionPane.showMessageDialog(null, "The original imput is: " + sentence); 
     JOptionPane.showMessageDialog(null, "Removing blanks - " + sentenceBlankless); 
     JOptionPane.showMessageDialog(null, "Input word - " + word); 

     for (int x = 0; x < word.length(); x++) { 

      if (sentenceBlankless.toLowerCase().contains(word.toLowerCase())) { 
       int loc = sentence.toLowerCase().indexOf(word.toLowerCase()); 
       JOptionPane.showMessageDialog(null, word.substring(0, word.length() - x) + " was found at location " + loc); 
      } else { 
       JOptionPane.showMessageDialog(null, word.substring(0, word.length() - x) + " was not found"); 
      } 
     } 
    } 
} 
+0

これは少し話題ですが、見つかった検索のリストを作成し、見つかった各検索のダイアログボックスでユーザーをスパムする代わりに、これを提示することを検討する必要があります。最後に、あなたの最初の投稿を作る上でのstackoverflowとcongratsへようこそ! – smac89

+0

@ Smac89ああ、それ。私の先生は、私たちがユーザーを「迷惑メール」していることを具体的に要求し、そのことを忘れていました。 –

答えて

0

ワードが

if (sentenceBlankless.toLowerCase().contains(word.toLowerCase())) { 
    int loc = sentence.toLowerCase().indexOf(word.toLowerCase()); 
    JOptionPane.showMessageDialog(null, word.substring(0, word.length() - x) + " was found at location " + loc); 
} 
else 
    JOptionPane.showMessageDialog(null, word.substring(0, word.length() - x) + " was not found"); 
    break; // break out of the loop 
} 
+0

ああ、事は、私の先生はブレークステートメントも好きではありません。彼はそれが悪いコードにつながると主張する。個人的に私は同意しない。 –

1

いくつかのコメント見つからなかった場合は、ループの外INGのbreakを考慮する必要があります。

声明if (sentenceBlankless.toLowerCase().contains(word.toLowerCase()))あなたが探している考慮されていませんが毎回wordという短いバージョンが必要です。代わりに、ちょうどあなたのダイアログボックスで、ユーザーへの短縮バージョンを示すのは、代わりに各反復でword短くチョップできます

word = word.substring(0, word.length() - x) 

しかし、それはあなたのforループを中断します。 #2のコメントに私をリード

。それは少しトリッキーですが、同じ場所で複数回、同じ単語を見つけることができないためとして

while(word.length() > 0) 

:あなたは同じように簡単にこれまでwhileループとしてできました。おそらくそれを行うための最も簡単な方法は、文字列にインデックスを表す各配列要素と、booleanの配列を次のようになります。

boolean[] foundPositions = new boolean[sentenceBlankless.length]; 

手近boolean primitive defaults to false。したがって、ある位置にサブ文字列wordのインスタンスが見つかるたびに、配列にフラグを設定します。

次に、あなたが配列あなたがwordを検索するたびにチェックし、それがすでに発見された場合、この時間を再検索を試してみたが位置から開始する必要があります。既に再帰をカバーしている場合、これは練習するのに良い時期です。 (私は完全にあなたの宿題をするつもりはありませんので)これは私がこれにアプローチする方法を示しているいくつかの擬似コードです:

private int FindPosition(string sentence, string word) 
{ 
    find the index of word in sentence 

    if not found 
     return -1 

    // We know sentence contains word 
    if not previously found 
     return found index 

    // We know it was found, but has been found before, let's try again 
    // but cut out the where it was found last time 
    // This is recursion (calling a method from within the method) 
    return FindPosition(sentence.substring, word) 
} 

は、フラグ配列の更新に注意してください、そして、あなたが戻って渡す必要がある特定の部分文字列再帰的な方法で。

+0

[this](http://imgur.com/cM0fghX)は使えますか? –

+0

試しましたか?それは動作しましたか?再帰的方法の考え方は、入力がすでにこの位置で見つかったかどうかを処理することだけです。 wordInputを短縮するループは、このメソッド内にあってはなりません。呼び出す必要があります。変数スコープを見直して、メソッド内でブール値配列を宣言できない理由を理解できるかどうかを確認してください。最良のアドバイス、いくつかの印刷ステートメントをコード全体に自由に挿入して実行し、それが何をしているかを見てください。 – Ian

1

"バイト"が見つかった場合は常に検索し、バイトの部分文字列は検索しないという問題があります。

これは、あなたはいつもいつも「バイト」であるwordを使用

if (sentenceBlankless.toLowerCase().contains(word.toLowerCase())) { 

このラインで起こる、それが更新されたことがないです。

だから、

if (sentenceBlankless.toLowerCase().contains(word.substring(0, word.length() - x).toLowerCase())) 

でそれを置き換えることができますが、私はそれをお勧めしません。代わりに、forループの各繰り返しでwordを更新してみてください。

だから、あなたが行うことができます:

word = word.substring(0, word.length() - x); 

ループのためのあなたの最終的には、次のようになります。

for (int x = 0; x < word.length(); x++) 
{ 
    word = word.substring(0, word.length() - x); 
    if (sentenceBlankless.toLowerCase().contains(word.toLowerCase())) 
    { 
     int loc = sentenceBlankless.toLowerCase().indexOf(word.toLowerCase()); 
     JOptionPane.showMessageDialog(null, word + " was found at location " + loc); 
    } 
    else 
     JOptionPane.showMessageDialog(null, word + " was not found"); 

} 

他のすべてがそのまま滞在することができます。

Offtopic:インサイド

声明loc場所を取得するためにsentenceの代わりsentenceBlanklessを使用している場合。

+0

私はあなたの提案を試して、私は境界のエラーを取得します。私は文字列の長さで遊んでいないので変なです –

+0

編集:私の部分のエラーは、(word.substring(0、word.length() - x)を持つ単語を印刷してみました –

+0

ああ、私はその部分も変更したと言わねばならなかった。同じ場所を2回印刷しないことについては、ハッシュマップを使うこともできた。 – yehyaawad

関連する問題