第一篇文章和所有这些。我是新手程序员。
无论如何,我的任务是创建一个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");
}
}
}
}
答案 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
}