Wordが文に存在する場合にtrueを返す関数のプログラミングと作業は初めてです。 indexOf()
メソッドを試しましたが、このアプローチで特定の問題に遭遇しました。
私の文が_I am a, Java Programmer.
_であるとします
indexOf()
メソッドでWord ram
を探すと、true
がram
に存在するため、Programmer
が返されます。 false
はWordとしてではなくパターンとして存在するため、正しい出力はram
になります。
この問題を回避するにはどうすればよいですか?私が現在使用しているコードは次のとおりです。
_boolean isPresent(String Word, String sentence)
{
if(sentence.indexOf(Word) >= 0)
return true;
else
return false;
}
_
注: Word ram
は、現在のアプローチの問題の1つを示すための例にすぎません。常にram
で作業する必要があるわけではありません.Wordはa
のようなもので、上記の文でコンマが続きます。
PDATE:コメントと解決策を提供してくれたすべての人に感謝します。私は受け入れられた答えとして1つを選択しました(許可されればもっと選択します:-))が、多くは役に立ちました。
正規表現を試してください
boolean contains = s.matches(".*\\bram\\b.*");
\ bは単語境界を意味します
Wordを検索するため、3つのケースがあります。
3つのケースすべてをカバーするための1つの可能な解決策は次のとおりです。
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
どのように単語を定義しますか?
他の文字で区切られた文字の束。この2番目の文字セットは、選択内容によって定義されます。これらを. ,?;
に選択するとします。したがって、これらの文字( delimiters と呼ばれる)で入力文字列を分割すると、words。入力に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;
}
Wordをアルファベット、数字、アンダースコアで構成されるものとして定義する場合は、\W+
という正規表現が用意されています。
String [] deli = s.split("\\W+");
Java Regex。について詳しく知りたい場合は、 この記事 を読むことを検討してください。
句読点があっても文中の単語と一致させたい場合は、次のような正規表現が必要です。
static boolean matchesWord(String toMatch, String matchIn) {
return Pattern.matches(".*([^A-Za-z]|^)"+toMatch+"([^A-Za-z]|$).*", matchIn);
}
(\ Wを使用できますが、アンダースコアを句読点としてカウントしません。)
スペースを最初と最後に連結するだけで、たとえば、文字列「I am a Java Programmer」のワード「programmer」は、末尾にスペースがないため一致しません。また、句読点の前後の単語には直接一致しません。
String.matches()
メソッドを見てください。正規表現を適切に作成すれば、望みどおりに実行できるはずです。正規表現を始めるのに適した場所は、Javaチュートリアル: http://docs.Oracle.com/javase/tutorial/essential/regex/
これは、各Wordがスペースで区切られていると仮定して機能します。わかりやすくするために、メイン関数を追加しました。 Wordが存在しない場合、find_strは-1を返します。それ以外の場合、他の単語に対するWordの位置を返します。ここでは、2が返されます。これは、2番目のWordが「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;
}
}
この解決策を試してください
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]);
}
}
より簡単なアプローチは次のとおりです。Wordが次のようなものであると考える場合
「私のPCにはramメモリがあります」(スペース間)
このように、検索するWordの前後にindexOf関数スペースに連結できます。
if(sentence.indexOf( "" + Word + "")> = 0){
これはかなり厄介な回避策ですが、正しい結果を達成するはずです。文字列内で探している部分文字列を見つけ、部分文字列の前後の文字を見つけます。 ASCII値を使用してこれらを確認してください(int)substring.charAt(x);
それらが文字であるかどうかを確認します。両方とも文字ではなく、文字列の境界外にある場合、Wordを見つけたことがわかります。それ以外の場合は、単にWordの一部であることを知っています。
ロジックは非常に長くなります。そのため、私はあなたのためにコーディングしていませんが、これを試して、説明が必要かどうかを教えてください。
ほら文を配列として分割してから、リストに入れることができます。その後、containsメソッドを使用して、Wordが存在するかどうかを確認できます。このコードをお試しください。
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;
}
}