Ellenőrizze, hogy egy karaktersorozat tartalmaz-e alstringet

1. Áttekintés

Ebben az oktatóanyagban több módszert is megvizsgálunk annak ellenőrzésére, hogy a Húr tartalmaz egy sztringet, és összehasonlítjuk mindegyik teljesítményét.

2. String.indexOf

Először próbáljuk ki a String.indexOf módszer. indexe megadja nekünk az első pozíciót, ahol a szubsztring megtalálható, vagy -1, ha egyáltalán nem található.

Amikor a „Rhap” kifejezésre keresünk, akkor a 9:

Assert.assertEquals (9, "Bohemian Rhapsodyan" .indexOf ("Rhap"));

Amikor a „rhap” kifejezésre keresünk, -1-et ad vissza, mert a kis- és nagybetűk különböznek.

Assert.assertEquals (-1, "Bohemian Rhapsodyan" .indexOf ("rhap")); Assert.assertEquals (9, "Bohemian Rhapsodyan" .toLowerCase (). IndexOf ("rhap"));

Fontos megjegyezni azt is, hogy ha a szubsztring „An”, akkor 6-ot ad vissza, mert az első előfordulást adja vissza:

Assert.assertEquals (6, "Bohemian Rhapsodyan" .indexOf ("an"));

3. Húr. Tartalmaz

Ezután próbáljuk meg Húr. Tartalmaz. tartalmazza alszöveget fog keresni az egészben Húr és visszatér igaz ha megtalálják és hamis másképp.

Ebben a példában tartalmazza visszatér igaz mert a „Hey” megtalálható.

Assert.assertTrue ("Hé Ho, menjünk". Tartalmaz ("Hé"));

Ha a karakterlánc nem található, tartalmazza visszatér hamis:

Assert.assertFalse ("Hé Ho, menjünk". Tartalmaz ("jey"));

Az utolsó példában a „hé” nem található, mert Húr. Tartalmaz kis- és nagybetű-érzékeny.

Assert.assertFalse ("Hé Ho, menjünk". Tartalmaz ("hé")); Assert.assertTrue ("Hé Ho, menjünk" .toLowerCase (). Tartalmazza ("hé"));

Érdekes pont az tartalmazza belső hívások indexetudni, hogy a szubsztring tartalmaz, vagy sem.

4. A StringUtils.containsIgnoreCase

Harmadik megközelítésünk a következő lesz StringUtils #tartalmazzaIgnoreCase az Apache Commons Lang könyvtárból:

Assert.assertTrue (StringUtils.containsIgnoreCase ("Szökött vonat", "vonat")); Assert.assertTrue (StringUtils.containsIgnoreCase ("Szökött vonat", "Vonat"));

Láthatjuk, hogy ez ellenőrzi, hogy a szubsztring tartalmazza a Húr, figyelmen kívül hagyva az esetet. Ezért tartalmazzaIgnoreCase visszatér igaz amikor a „Trai” és a „trai” kifejezésre keresünk a „Runaway Train” belsejében.

Ez a megközelítés nem lesz olyan hatékony, mint az előző megközelítések mivel további időbe telik az eset figyelmen kívül hagyása. tartalmazzaIgnoreCase belsőleg konvertál minden betűt nagybetűvé, és összehasonlítja az átalakított betűket az eredeti betűk helyett.

5. Használata Minta

Utolsó megközelítésünk a Minta szabályos kifejezéssel:

Mintaminta = Pattern.compile ("(?

Ezt megfigyelhetjük fel kell építenünk a Minta először, akkor létre kell hoznunk a Matcher, és végül ellenőrizhetjük a megtalálja metódus, ha az alstring előfordul, vagy sem:

Matcher matcher = minta.matcher ("Hit the road Jack"); Assert.assertTrue (matcher.find ());

Például az első alkalommal megtalálja végrehajtják, visszatér igaz mert az „út” szó a „Hit the road Jack” sztring belsejében található, de amikor megpróbáljuk megtalálni ugyanazt a szót a hamis:

Matcher matcher = minta.matcher ("és nem jössz többé vissza"); Assert.assertFalse (matcher.find ());

6. Teljesítmény-összehasonlítás

Az úgynevezett nyílt forráskódú mikro-benchmark keretrendszert fogjuk használni Java Microbenchmark hám (JMH) annak eldöntésére, hogy melyik módszer a leghatékonyabb a végrehajtási idő szempontjából.

6.1. Összehasonlító beállítás

Mint minden JMH benchmarkban, képesek vagyunk a-t írni beállít módszer, annak érdekében, hogy bizonyos dolgok helyben legyenek, mielőtt a referenciaértékeink futnának:

@Setup public void setup () {message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit," + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + "Ut enim ad minim veniam, quis nostrud exercise ullamco laboris "+" nisi ut aliquip ex ea commodo következmény. Duis aute irure dolor in "+" reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. "+" Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt "+" mollit anim id est laborum "; minta = Pattern.compile ("(?

Ban,-ben beállít módszerrel inicializáljuk a üzenet terület. Ezt használjuk forrásszövegként a különböző keresési megvalósításokhoz.

Mi is inicializáljuk minta annak későbbi felhasználása érdekében az egyik referenciaértékünkben.

6.2. A String.indexOf Viszonyítási alap

Az első referenciaértékünket használni fogjuk indexe:

@Benchmark public int indexOf () {return message.indexOf ("eiusmod"); }

Meg fogjuk keresni, hogy az „eiusmod” melyik pozícióban van a üzenet változó.

6.3. A Húr. Tartalmaz Viszonyítási alap

A második referenciaértékünket használni fogjuk tartalmazza:

A @Benchmark nyilvános logikai elem tartalmazza () {return message.contains ("eiusmod"); }

Megpróbáljuk megtalálni, ha a üzenet érték tartalmazza „Eiusmod”, ugyanaz szubsztring használták az előző benchmarkban.

6.4. A A StringUtils.containsIgnoreCase Viszonyítási alap

A harmadik referenciaértékünket használni fogjuk StringUtils #tartalmazzaIgnoreCase:

@Benchmark nyilvános logikai elem tartalmazzaStringUtilsIgnoreCase () {return StringUtils.containsIgnoreCase (üzenet, "eiusmod"); }

Az előző referenciaértékekhez hasonlóan itt is keresünk szubsztring ban,-ben üzenet érték.

6.5. A Minta Viszonyítási alap

És az utolsó referenciaértékünket használni fogjuk Minta:

@Benchmark nyilvános logikai keresésWithPattern () {return pattern.matcher (üzenet) .find (); }

A programban inicializált mintát fogjuk használni beállít módszer a Matcher és képes legyen felhívni a megtalálja módszerrel, ugyanazt az alszekciót használva, mint korábban.

6.6. A benchmark-eredmények elemzése

Fontos megjegyezni nanoszekundumokban értékeljük az összehasonlító eredményeket.

A JMH teszt lefuttatása után láthatjuk az átlagos időtartamot:

  • tartalmazza: 14,736 ns
  • indexe: 14.200 ns
  • tartalmazzaStringUtilsIgnoreCase: 385,632 ns
  • searchWithPattern: 1014.633 ns

indexe módszer a leghatékonyabb, amelyet szorosan követ tartalmazza. Ennek van értelme tartalmazza hosszabb ideig tartott, mert használja indexe belsőleg.

tartalmazzaStringUtilsIgnoreCase több időt vett igénybe az előzőekhez képest, mert a kis- és nagybetűk nem érzékenyek.

searchWithPattern, még magasabb átlagos időt vett igénybe az utolsó, annak bizonyítása, hogy használja Mintas a legrosszabb alternatíva ehhez a feladathoz.

7. Következtetés

Ebben a cikkben különféle módszereket tártunk fel az a Húr. Összehasonlítottuk a különböző megoldások teljesítményét is.

Mint mindig, a kód elérhető a GitHubon.


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