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.


$config[zx-auto] not found$config[zx-overlay] not found