Skontrolujte, či reťazec obsahuje viac kľúčových slov v Jave

1. Úvod

V tomto rýchlom návode zistíme, ako zistiť viac slov vo vnútri reťazca.

2. Náš príklad

Predpokladajme, že máme reťazec:

Reťazec inputString = "ahoj, Baeldung";

Našou úlohou je zistiť, či inputString obsahuje "Ahoj" a „Baeldung“ slov.

Dajme teda kľúčové slová do poľa:

Reťazec [] slová = {"ahoj", "Baeldung"};

Poradie slov navyše nie je dôležité a pri zhody by sa mali rozlišovať veľké a malé písmená.

3. Používanie String.contains ()

Na začiatok ukážeme si, ako používať String.contains () metóda na dosiahnutie nášho cieľa.

Prejdime slučku cez pole kľúčových slov a skontrolujme výskyt každej položky vo vnútri string vstupu:

public static boolean containsWords (String inputString, String [] items) {boolean found = true; for (String item: items) {if (! inputString.contains (item)) {found = false; prestávka; }} návrat nájdený; }

The obsahuje () metóda sa vráti pravda ak inputString obsahuje dané položka. Ak vo svojom reťazci nemáme žiadne kľúčové slová, môžeme sa zastaviť v pohybe vpred a okamžite sa vrátiť nepravdivé.

Napriek tomu, že musíme napísať viac kódu, je toto riešenie rýchle pre jednoduché prípady použitia.

4. Používanie String.indexOf ()

Podobné riešeniu, ktoré využíva String.contains () metóda, môžeme skontrolovať indexy kľúčových slov pomocou String.indexOf () metóda. Na to potrebujeme metódu akceptujúcu inputString a zoznam kľúčových slov:

public static boolean containsWordsIndexOf (String inputString, String [] words) {boolean found = true; pre (Reťazcové slovo: slová) {if (inputString.indexOf (word) == -1) {found = false; prestávka; }} návrat nájdený; }

The indexOf () metóda vráti index slova vo vnútri súboru inputString. Ak slovo nemáme v texte, index bude -1.

5. Používanie regulárnych výrazov

Teraz použijeme regulárny výraz, ktorý bude zodpovedať našim slovám. Na to použijeme Vzor trieda.

Najskôr definujeme reťazcový výraz. Pretože potrebujeme priradiť dve kľúčové slová, zostavíme naše pravidlo regulárneho výrazu s dvoma lookaheads:

Pattern pattern = Pattern.compile ("(? =. * Ahoj) (? =. * Baeldung)");

A pre všeobecný prípad:

StringBuilder regexp = nový StringBuilder (); pre (Reťazcové slovo: slová) {regexp.append ("(? =. *"). append (slovo) .append (")"); }

Potom použijeme dohadzovač () metóda do Nájsť() výskyty:

public static boolean containsWordsPatternMatch (String inputString, String [] words) {StringBuilder regexp = new StringBuilder (); pre (Reťazcové slovo: slová) {regexp.append ("(? =. *"). append (slovo) .append (")"); } Vzor vzor = Pattern.compile (regexp.toString ()); návratový vzor.matcher (inputString) .find (); }

Ale, regulárne výrazy majú náklady na výkon. Ak máme vyhľadať viac slov, výkon tohto riešenia nemusí byť optimálny.

6. Používanie Java 8 a Zoznam

A nakoniec môžeme použiť Stream API v Java 8. Najprv však urobme niekoľko menších transformácií s našimi počiatočnými údajmi:

Zoznam inputString = Arrays.asList (inputString.split ("")); Zoznam slov = Arrays.asList (slová);

Teraz je čas použiť Stream API:

public static boolean containsWordsJava8 (String inputString, String [] words) {List inputStringList = Arrays.asList (inputString.split ("")); List wordsList = Arrays.asList (slová); vrátiť slováList.stream (). allMatch (inputStringList :: contains); }

Prevádzkový plynovod vyššie sa vráti pravda ak vstupný reťazec obsahuje všetky naše kľúčové slová.

Prípadne môžeme jednoducho použiť containsAll () metóda rámca zbierok na dosiahnutie požadovaného výsledku:

public static boolean containsWordsArray (String inputString, String [] words) {List inputStringList = Arrays.asList (inputString.split ("")); List wordsList = Arrays.asList (slová); návrat inputStringList.containsAll (wordsList); }

Táto metóda však funguje iba pre celé slová. Našlo by teda naše kľúčové slová, iba ak by boli v texte oddelené medzerami.

7. Pomocou Aho-Corasick Algoritmus

Jednoducho povedané Aho-Corasick Algoritmus je na textové vyhľadávanie s viacerými kľúčovými slovami. O (n) časová zložitosť bez ohľadu na to, koľko kľúčových slov hľadáme alebo aká je dĺžka textu.

Zahrňme do nášho závislosť algoritmu Aho-Corasick pom.xml:

 org.ahocorasick ahocorasick 0.4.0 

Najskôr postavme trie potrubie s slov pole kľúčových slov. Na to použijeme dátovú štruktúru Trie:

Trie trie = Trie.builder (). OnlyWholeWords (). AddKeywords (words) .build ();

Potom zavoláme parserovú metódu s inputString text, v ktorom by sme chceli nájsť kľúčové slová a uložiť výsledky do vyžaruje zbierka:

Zbierka emits = trie.parseText (inputString);

A nakoniec, ak vytlačíme naše výsledky:

emits.forEach (System.out :: println);

Pre každé kľúčové slovo uvidíme počiatočnú pozíciu kľúčového slova v texte, koncovú pozíciu a samotné kľúčové slovo:

0: 4 = ahoj 13:20 = Baeldung

Na záver sa pozrime na úplnú implementáciu:

public static boolean containsWordsAhoCorasick (String inputString, String [] words) {Trie trie = Trie.builder (). onlyWholeWords (). addKeywords (words) .build (); Zbierka emits = trie.parseText (inputString); emits.forEach (System.out :: println); boolean found = true; pre (Reťazcové slovo: slová) {boolean contains = Arrays.toString (emits.toArray ()). contains (word); if (! contains) {found = false; prestávka; }} návrat nájdený; }

V tomto príklade hľadáme iba celé slová. Ak sa teda chceme zhodovať nielen s inputString ale „AhojBaeldung“ rovnako by sme mali jednoducho odstrániť onlyWholeWords () atribút z Trie staviteľské potrubie.

Okrem toho nezabudnite, že tiež odstránime duplicitné prvky z priečinka vyžaruje kolekcia, pretože pre to isté kľúčové slovo môže existovať viac zhôd.

8. Záver

V tomto článku sme sa naučili, ako nájsť viac kľúčových slov vo vnútri reťazca. Navyše, ukázali sme príklady pomocou jadra JDK, ako aj pomocou Aho-Corasick knižnica.

Úplný kód tohto článku je ako obvykle k dispozícii na serveri GitHub.


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