2016-01-25 3 views
6

Первое сообщение и все такое. Я начинающий программист.Найти любое слово в предложении

В любом случае мне было поручено создать программу на Java, которая будет принимать пользовательский ввод в виде предложения и слова. Программа удаляет пробелы из предложения и проверяет, присутствует ли слово в предложении «пустое». Однако программа также удаляет букву с конца слова и проверяет, есть ли слово, содержащееся в беспутном предложении. Программа продолжает удалять буквы из слова, пока не будет удалено больше писем.

Кроме того, программа также должна указывать местоположение слова, но не может перечислить одно местоположение несколько раз. Если программа не может найти целое слово, оно печатает «Слово» не найдено ». Если это так, он печатает «Слово» найдено в месте «x» «

например. Если мое предложение «Она поет по реке» и по слову «байт», код должен проверять «shesingsbytheriver» на «byte», «byt», «by» и «b», но он НЕ МОЖЕТ найти «byt», «by» и «b» в том же месте.

Ниже приведен код. Все в порядке до моего заявления if. Вместо того, чтобы находить слово в беспутном предложении, оно продолжает печатать «Слово» не найдено ».

Несколько последних замечаний: мне следует избегать массивов, и большинство команд, которые мне нужны, относятся к классу 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 и поздравляю вас с созданием первого сообщения! – smac89

+0

@ Smac89 Ах, да. Мой учитель специально спросил, что мы «спам» пользователя, забыл упомянуть об этом ха-ха. –

ответ

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 
} 
+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 с, причем каждый элемент массива, представляющего индекс в строке:

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

Будет ли [это] (http://imgur.com/cM0fghX) работать? –

+0

Вы пробовали? Это сработало? Идея рекурсивного метода состоит только в том, чтобы определить, был ли введен ввод слова в этой позиции. Цикл для сокращения словаInput не должен находиться внутри этого метода, он должен его вызвать. Вернитесь назад и просмотрите область переменных и посмотрите, можете ли вы решить, почему вы не можете объявить логический массив внутри метода. Лучший совет, вставьте некоторые заявления печати свободно во всем коде, чтобы запустить его и посмотреть, что он делает. – Ian

1

Ваша проблема заключается в том, что он всегда ищет, найден ли «байт», а не подстроки байта.

Это происходит на этой линии

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

Вы всегда использовать word, который всегда «байт», он никогда не обновляется.

Таким образом, вы можете заменить его

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

, но я бы не рекомендовал его. Вместо этого попробуйте обновить слово на каждой итерации цикла for.

Так что вы можете сделать:

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

О, да, я должен был упомянуть, что я тоже изменил эту часть. Также, если вы не печатаете одно и то же место дважды, вы можете использовать хэш-карту, однако я не был уверен, как ваш инструктор хочет, чтобы вы его разрешили. – yehyaawad

Смежные вопросы