Ответ 1
попробуйте regex
boolean contains = s.matches(".*\\bram\\b.*");
\ b означает границу слова
Я новичок в программировании и работе над функцией, чтобы возвращать true, если слово присутствует в предложении. Я попробовал метод indexOf()
, но затем я также столкнулся с определенной проблемой при таком подходе:
Предположим, что мое предложение I am a, Java Programmer.
Если мы ищем слово ram
с помощью метода indexOf()
, то оно вернет true
, потому что ram
присутствует в Programmer
, тогда как правильный вывод должен быть false
, поскольку ram
не является присутствовать как слово, но как образец.
Как я могу обойти эту проблему? Код, который я использую на данный момент:
boolean isPresent(String word, String sentence)
{
if(sentence.indexOf(word) >= 0)
return true;
else
return false;
}
ПРИМЕЧАНИЕ: Слово ram
является просто примером, чтобы показать одну из проблем с моим текущим подходом. Не то, чтобы мне приходилось работать с ram
только все время. Слово может быть любым, например say a
, за которым следует запятая в приведенном выше предложении.
ОБНОВЛЕНИЕ: Спасибо всем за предоставление комментариев и решений. Я выбрал один из них как принятый ответ (выбрал бы больше, если разрешено:-)), но много было полезно.
попробуйте regex
boolean contains = s.matches(".*\\bram\\b.*");
\ b означает границу слова
Поскольку вы хотите найти слово, есть три случая:
Чтобы охватить все три случая, одно из возможных решений:
String str = "I am a JAVA programmer";
String[] splited = str.split("\\b+"); //split on word boundries
Arrays.asList(splited).contains("ram"); //search array for word
Как вы определяете слово?
Букет символов, разделенных другими символами. Этот второй набор символов определяется тем, что вы выбираете. Предположим, вы выбрали их как . ,?;
. Поэтому, если вы разделите строку ввода на эти символы (называемые разделители), вы получите кучу строки, которая является словами. Теперь, чтобы найти, содержит ли вход слово или нет, перебирайте эти строки, чтобы проверить, соответствуют ли они вашему запросу.
boolean isPresent(String query, String s) {
String [] deli = s.split("[.\\s,?;]+");
for(int i=0;i<deli.length;i++)
if(query.equals(deli[i]))
return true;
return false;
}
Если вы хотите, чтобы слово определялось как все, что состоит из алфавитов, цифр и подчеркивания, для вас есть регулярное выражение: \W+
.
String [] deli = s.split("\\W+");
Рассмотрите возможность чтения этой статьи, если вы хотите узнать больше о Java Regex.
Взгляните на метод String.matches()
. Если вы правильно построите правильное выражение, оно должно быть в состоянии делать то, что вы хотите. Хорошим местом для регулярных выражений были обучающие программы Java: http://docs.oracle.com/javase/tutorial/essential/regex/
Если вы хотите совместить слово в предложении даже с пунктуацией, вам понадобится регулярное выражение:
static boolean matchesWord(String toMatch, String matchIn) {
return Pattern.matches(".*([^A-Za-z]|^)"+toMatch+"([^A-Za-z]|$).*", matchIn);
}
(Вы можете использовать \W, но это не означает, что символы подчеркивания являются пунктуацией.)
Просто конкатенация пробелов в начало и конец не будет соответствовать, например, слову "программист" в строке "Я программист на Java", потому что в конце нет места. Он также не будет соответствовать словам непосредственно перед или после пунктуации.
Попробуйте это решение
int index = sent.indexOf(find);
if (index != -1) {
if (index == 0) {
System.out.println("true");
}
else if (index + find.length() == sent.length())
{
System.out.println("true");
}
else if (sent.charAt(index - 1) == ' ' && sent.charAt(find.length() + index) == ' ') {
System.out.println("true");
} else {
System.out.println("false");
}
} else {
System.out.println("false");
}
Если вам требуется нечто большее, чем исходный вопрос, вместо этого для проверки пробелов вы должны проверить, что они не находятся между 0-9 и a-Z, это должно охватывать любые символы, такие как период запятой и т.д.
String s="I am a JAVA programmer";
String s1="JAVA";
String []p=s.split("\\s*(=>|,|\\s)\\s*");
for(int i=0;i<p.length;i++)
{
if(s1.equals(p[i]))
{
System.out.println(p[i]);
}
}
Более простой подход: если вы считаете, что слово что-то вроде
"Мой компьютер имеет RAM память" (между пробелами)
вы могли бы присоединиться к вашим функциональным пространствам indexOf до и после слова, которое вы ищете, например
if (sentence.indexOf( "+ word +" ") >= 0) {
Это будет работать, если предположить, что каждое слово разделяется пробелом. Я добавил основную функцию для ясности. Find_str возвращает -1, если слово не существует. в противном случае он возвращает позицию слова относительно других слов. Здесь будет возвращено 2, что означает, что второе слово - "am".
import java.util.*;
public class HelloWorld{
public static void main(String []args){
String str="I am a Java Programmer";
String str1="am";
int x=find_str(str,str1);
System.out.println(x);
}
public static int find_str(String main,String search) {
int i;
int found=-1;
String[] s=main.split(" ");
for(i=0;i<s.length;i++)
{
if(search.equals(s[i]))
found=i+1;
}
return found;
}
}
Это довольно неуклюжий обходной путь, но он должен достичь правильных результатов. Найдите подстроку, которую вы ищете внутри строки, и найдите charachters до и после вашей подстроки. Проверьте их, используя их значения ascii (int)substring.charAt(x);
, чтобы увидеть, являются ли они буквами или нет. Если они оба являются eithr не буквами или выходят за пределы строки, вы знаете, что нашли слово. В противном случае вы знаете, что это просто часть слова.
Логика будет очень длинной - вот почему я не кодирую ее для вас, но дайте ей шанс и дайте мне знать, если вам нужно разъяснение.
Hlo. Вы можете разделить предложение как массив, а затем положить в список. после этого вы можете использовать метод, чтобы проверить, присутствует ли ваше слово или нет. Пожалуйста, попробуйте этот код.
import java.util.ArrayList;
import java.util.Arrays;
public class karthitest {
public static void main(String[] args) {
String sentence = "I am Karthick";
String word = "I";
if(isWordExist(sentence, word)){
System.out.println("Word is exist");
}
}
public static boolean isWordExist(String sentence, String word){
boolean ans = Boolean.FALSE;
ArrayList<String> wordList = null;
try {
if(sentence != null && word != null){
wordList = new ArrayList<String>(Arrays.asList(sentence.split("[^a-zA-z]+")));
if(wordList.contains(word)){
ans = Boolean.TRUE;
}
}
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
return ans;
}
}
использовать содержит метод
boolean isPresent(String word, String sentence)
{
return sentence.contains(word);
}
EDIT: если вы хотите найти паритикулярное слово, вы можете добавить пробел и после словарной строки
word =" "+ word +" ";