Ellenőrizze, hogy egy karakterlánc tartalmaz-e több kulcsszót a Java-ban
1. Bevezetés
Ebben a gyors bemutatóban megtudjuk, hogyan lehet több szót észlelni egy húr belsejében.
2. Példánk
Tegyük fel, hogy megvan a karakterlánc:
String inputString = "hello there, Baeldung";
Feladatunk megtalálni, hogy a inputString tartalmazza a "Helló" és „Baeldung” szavak.
Tehát tegyük a kulcsszavakat egy tömbbe:
Karakterlánc [] szavak = {"szia", "Baeldung"};
Ráadásul a szavak sorrendje nem fontos, és a mérkőzéseknek különbséget kell tenniük a kis- és nagybetűk között.
3. Használata A karakterlánc. Tartalmaz ()
Először is, megmutatjuk, hogyan kell használni a A karakterlánc. Tartalmaz () módszer a célunk eléréséhez.
Nézzük át a kulcsszavak tömbjét, és ellenőrizzük az egyes elemek előfordulását a inputString:
nyilvános statikus logikai logó tartalmazzaWords (String inputString, String [] elemeket) {logikai talált = true; for (String item: items) {if (! inputString.contains (item)) {talált = hamis; szünet; }} visszatérés talált; }
A tartalmaz () módszer visszatér igaz ha a inputString tartalmazza az adott tétel. Ha egyik kulcsszó sincs a karakterláncunkban, leállíthatjuk a továbblépést, és azonnal visszatérhetünk hamis.
Annak ellenére, hogy több kódot kell írnunk, ez a megoldás gyors az egyszerű használati esetekben.
4. Használata String.indexOf ()
Hasonló a megoldáshoz, amely a A karakterlánc. Tartalmaz () módszer, a kulcsszavak indexeit a String.indexOf () módszer. Ehhez szükségünk van egy módszerre, amely elfogadja a inputString és a kulcsszavak listája:
public static boolean tartalmazzaWordsIndexOf (String inputString, String [] szavak) {logikai talált = igaz; mert (Karakter szó: szavak) {if (inputString.indexOf (szó) == -1) {talált = hamis; szünet; }} visszatérés talált; }
A indexe() metódus a szó indexét adja vissza a inputString. Ha nincs szó a szövegben, az index -1 lesz.
5. A reguláris kifejezések használata
Most használjunk reguláris kifejezést a szavakhoz. Ehhez a Minta osztály.
Először definiáljuk a string kifejezést. Mivel két kulcsszónak meg kell egyeznünk, két keresési fejjel építjük a regex szabályunkat:
Minta minta = Minta.kompile ("(? =. * Szia) (? =. * Baeldung)");
És az általános esetre:
StringBuilder regexp = új StringBuilder (); mert (Karakter szó: szavak) {regexp.append ("(? =. *"). append (szó) .append (")"); }
Ezt követően használjuk a egyező () módszer a megtalálja() az előfordulások:
public static boolean tartalmazzaWordsPatternMatch (String inputString, String [] szavak) {StringBuilder regexp = new StringBuilder (); mert (Karaktersorozat: szavak) {regexp.append ("(? =. *"). append (word) .append (")"); } Mintaminta = Pattern.compile (regexp.toString ()); return minta.matcher (inputString) .find (); }
De, a rendszeres kifejezéseknek teljesítményköltségük van. Ha több szót kell keresnünk, akkor a megoldás teljesítménye nem biztos, hogy optimális.
6. Java 8 és Lista
És végül használhatjuk a Java 8 Stream API-ját. De először tegyünk néhány kisebb átalakítást a kezdeti adatainkkal:
List inputString = Arrays.asList (inputString.split ("")); Sorolja fel a szavakat = tömbök. AsList (szavak);
Itt az ideje használni a Stream API-t:
nyilvános statikus logikai érték tartalmazzaWordsJava8 (String inputString, String [] szavak) {List inputStringList = Arrays.asList (inputString.split ("")); ListageList = tömbök.asList (szavak); return wordsList.stream (). allMatch (inputStringList :: tartalmaz); }
A fenti műveleti csővezeték visszatér igaz ha a beviteli karakterlánc tartalmazza az összes kulcsszavunkat.
Alternatív megoldásként egyszerűen használhatjuk a tartalmazzaAll () a gyűjtemény keretrendszerének módszere a kívánt eredmény elérése érdekében:
nyilvános statikus logikai érték tartalmazzaWordsArray (String inputString, String [] szavak) {List inputStringList = Arrays.asList (inputString.split ("")); List wordsList = tömbök.asList (szavak); return inputStringList.containsAll (wordsList); }
Ez a módszer azonban csak egész szavakra érvényes. Tehát csak akkor találná meg a kulcsszavakat, ha a szövegen belül szóközzel elválasztják őket.
7. A Aho-Corasick Algoritmus
Egyszerűen fogalmazva: Aho-Corasick algoritmus több kulcsszóval történő szöveges keresésre szolgál. Megvan Tovább) az idő bonyolultsága, függetlenül attól, hogy hány kulcsszót keresünk, vagy hosszú a szöveg hossza.
Vegyük bele az Aho-Corasick algoritmusfüggőséget pom.xml:
org.ahocorasick ahocorasick 0.4.0
Először építsük meg a trie csővezetéket a szavak kulcsszavak tömbje. Ehhez a Trie adatstruktúrát fogjuk használni:
Trie trie = Trie.builder (). OnlyWholeWords (). AddKeywords (szavak) .build ();
Ezt követően hívjuk meg az elemző metódust a inputString szöveg, amelyben szeretnénk megtalálni a kulcsszavakat és elmenteni az eredményeket a kibocsájt Gyűjtemény:
A gyűjtemény kibocsátja = trie.parseText (inputString);
És végül, ha kinyomtatjuk az eredményeket:
emits.forEach (System.out :: println);
Minden kulcsszónál látni fogjuk a kulcsszó kezdő pozícióját a szövegben, a végpontot és magát a kulcsszót:
0: 4 = hello 13: 20 = Baeldung
Végül nézzük meg a teljes megvalósítást:
nyilvános statikus logikai érték tartalmazzaWordsAhoCorasick (String inputString, String [] szavak) {Trie trie = Trie.builder (). onlyWholeWords (). addKeywords (words) .build (); A gyűjtemény kibocsátja = trie.parseText (inputString); emits.forEach (System.out :: println); logikai talált = igaz; mert (Karaktersorozat: szavak) {logikai elem = Arrays.toString (emits.toArray ()). tartalmaz (word); ha (! tartalmaz) {talált = hamis; szünet; }} visszatérés talált; }
Ebben a példában csak egész szavakat keresünk. Tehát, ha nem csak a inputString de „HelloBaeldung” valamint egyszerűen el kell távolítanunk a onlyWholeWords () attribútum a Trie építő csővezeték.
Ezenkívül ne feledje, hogy a duplikált elemeket is eltávolítjuk a kibocsájt gyűjtemény, mivel előfordulhat, hogy több egyezés van ugyanarra a kulcsszóra.
8. Következtetés
Ebben a cikkben megtanultuk, hogyan lehet több kulcsszót találni egy karakterláncban. Ráadásul, példákat mutattunk a mag JDK-jának, valamint a használatával az Aho-Corasick könyvtár.
Szokás szerint a cikk teljes kódja elérhető a GitHubon.