在一个句子中查找任何单词

时间:2016-01-25 04:03:34

标签: java

第一篇文章和所有这些。我是新手程序员。

无论如何,我的任务是创建一个Java程序,它将以句子和单词的形式接受用户输入。该程序从句子中删除空格,并检查该单词是否出现在“无空白”句子中。但是,程序还会从单词的末尾删除一个字母,并检查 单词是否出现在无空白句子中。程序继续从单词中删除字母,直到没有更多字母要删除。

此外,程序还应该说明单词的位置,但不能多次列出一个位置。如果程序找不到整个单词,则打印出“未找到'Word'。”如果是,则打印出''Word',位于'x'位置

e.g。如果我的句子是“她在河边唱歌”并且字是“字节”,那么代码应该检查“shesingsbytheriver”中的“byte”,“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");
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

一些评论:

声明if (sentenceBlankless.toLowerCase().contains(word.toLowerCase()))没有考虑到您每次都在寻找更短版本的word。您不必在对话框中向用户显示缩短版本,而是可以在每次迭代时缩短word缩短版本:

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

但这会破坏你的for循环。

这引导我发表评论#2。您可以像while循环一样轻松地使用它:

while(word.length() > 0)

至于无法在同一位置多次找到相同的单词,这有点棘手。可能最简单的方法是使用boolean s数组,每个数组元素代表字符串中的索引:

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)
}

请注意更新标志数组,以及需要在递归方法中传回的特定子字符串。

答案 1 :(得分:1)

你的问题是它一直在搜索&#34; byte&#34;找到了,而不是字节的子串。

这就发生在这一行

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

您总是使用始终&#34;字节&#34;的word,它永远不会更新。

所以你可以用

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

但我不推荐它。而是尝试在for循环的每次迭代中更新单词。

所以你可以这样做:

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

你的最终for循环将是:

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:

if语句loc内部使用sentence代替sentenceBlankless来获取位置。

答案 2 :(得分:0)

如果找不到单词,你应该考虑break离开循环

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
}