Programavimas

„Java“ patarimas 112: patobulinkite informacijos gausių eilučių žymėjimą

Dauguma „Java“ programuotojų naudojo java.util.StringTokenizer klasė tam tikru ar kitu metu. Tai yra patogi klasė, kuri iš esmės simbolizuoja (pertraukia) įvesties eilutę, pagrįstą separatoriumi, ir paprašius tiekia žetonus. (Tokenizavimas yra simbolių sekos pavertimas tokenais, kuriuos supranta jūsų programa.)

Nors ir patogu, „StringTokenizer“funkcionalumas yra ribotas. Klasė paprasčiausiai ieško skiriamojo elemento įvesties eilutėje ir, aptikusi skiriklį, pertraukia eilutę. Jis netikrina sąlygų, pvz., Ar atribiklis yra poskyryje, ir negrąžina prieigos rakto kaip "" (eilutės ilgis 0), kai įvestyje randami du iš eilės skyrikliai. Norint įvykdyti šiuos apribojimus, „Java 2“ platforma (nuo JDK 1.2 ir naujesnė versija) pateikiama kartu su „BreakIterator“ klasė, kuri yra patobulinta žymėjimo priemonė „StringTokenizer“. Kadangi tokios klasės nėra JDK 1.1.x versijoje, kūrėjai dažnai praleidžia daug laiko rašydami savo reikalavimus atitinkantį originalų žymeklį. Dideliame projekte, susijusiame su duomenų formatų tvarkymu, neretai galima rasti daug tokių pritaikytų klasių.

Šio patarimo tikslas - padėti jums parašyti rafinuotą žymeklį, naudojant esamą „StringTokenizer“.

„StringTokenizer“ apribojimai

Galite sukurti „StringTokenizer“ naudojant bet kurį iš šių trijų konstruktorių:

  1. „StringTokenizer“ („String sInput“): Pertraukos tarpuose ("", "\ t", "\ n").
  2. „StringTokenizer“ („String sInput“, „String sDelimiter“): Pertraukos sDelimiteris.
  3. „StringTokenizer“ („String sInput“, „String sDelimiter“, „Boolean bReturnTokens“): Pertraukos sDelimiteris, bet jei bReturnTokens yra nustatyta kaip teisinga, tada atribiklis taip pat grąžinamas kaip žetonas.

Pirmasis konstruktorius netikrina, ar įvesties eilutėje yra pakraščių. Kai styga "sveiki. Šiandien aš einu į savo gimtąjį miestą" yra pažymėtas baltuoju tarpu, rezultatas yra ženkluose Sveiki., Šiandien, „Aš, esu, ", vyksta, vietoj Sveiki., Šiandien, "Aš esu ", vyksta.

Antrasis konstruktorius netikrina atribotojų iš eilės išvaizdos. Kai styga "knyga, autorius, leidinys ,,, paskelbimo data" yra pažymėtas ",", „StringTokenizer“ grąžina keturis žetonus su reikšmėmis knyga, autorius, leidinysir paskelbimo data vietoj šešių verčių knyga, autorius, leidinys, "", ""ir paskelbimo data, kur "" reiškia 0 ilgio eilutę. Norėdami gauti šešis, turite nustatyti „StringTokenizer“'s bReturnTokens parametras į true.

Parametro nustatymo į „True“ ypatybė yra svarbi, nes tai suteikia idėją apie tai, ar yra nuoseklūs ribotuvai. Pavyzdžiui, jei duomenys gaunami dinamiškai ir naudojami atnaujinant lentelę duomenų bazėje, kur įvesties žetonai susiejami su stulpelių reikšmėmis, tada negalime susieti žetonų su duomenų bazės stulpeliais, nes nesame tikri, kuriuos stulpelius reikėtų nustatyti į "". Pavyzdžiui, norime pridėti įrašus į lentelę su šešiais stulpeliais, o įvesties duomenyse yra du iš eilės skiriamieji skyrikliai. Rezultatas iš „StringTokenizer“ šiuo atveju yra penki žetonai (nes du iš eilės skiriamieji ženklai žymi žetoną "", kuris „StringTokenizer“ nepaisymas), ir mes turime nustatyti šešis laukus. Mes taip pat nežinome, kur atsiras nuoseklus ribotuvas, taigi, kuris stulpelis turėtų būti nustatytas "".

Trečiasis konstruktorius neveiks, jei pats prieigos raktas (ilgio ir vertės atžvilgiu) yra lygus skiriamajam ir yra poskirsnyje. Kai styga "knyga, autorius, leidinys, \", \ ", paskelbimo data" yra pažymėtas (šioje eilutėje yra , kaip žetoną, kuris yra toks pat kaip jo atribiklis) eilutėje ,, rezultatas yra knyga, autorius, leidinys, ", ", paskelbimo data (su šešiais žetonais) vietoj knyga, autorius, leidinys, , (kablelio simbolis), paskelbimo data (su penkiais žetonais). Atminkite, net nustatydami bReturnTokens (trečias parametras į „StringTokenizer“) šiuo atveju jums nepadės.

Pagrindiniai tokenizerio poreikiai

Prieš spręsdami kodą, turėsite žinoti pagrindinius gero žetonų tvarkytuvo poreikius. Kadangi „Java“ kūrėjai yra įpratę „StringTokenizer“ klasėje, geras žymeklis turėtų turėti visus naudingus metodus, kuriuos teikia klasė, pvz hasMoreTokens (), nextToken (), countTokens ().

Šio patarimo kodas yra paprastas ir dažniausiai savaime suprantamas. Iš esmės aš naudojau „StringTokenizer“ klasė (sukurta su bReturnTokens nustatyta kaip teisinga) viduje ir pateikti metodai, minėti aukščiau. Kadangi kai kuriais atvejais atribotuvas reikalingas kaip prieigos raktai (labai retais atvejais), o kai kuriais atvejais to nėra, atpažinimo ženklas paprašius turi pateikti atskyriklį kaip žetoną. Kai sukursite a „PowerfulTokenizer“ objektas, perduodamas tik įvesties eilutę ir ribotuvą, jis viduje naudoja a „StringTokenizer“ su bReturnTokens nustatyta tiesa. (To priežastis yra, jei a „StringTokenizer“ yra sukurtas be bReturnTokens nustatyta tiesa, tada ji yra ribota įveikti anksčiau nurodytas problemas). Norint tinkamai valdyti žymeklį, kodas patikrina, ar bReturnTokens keliose vietose nustatyta teisinga (skaičiuojant bendrą žetonų skaičių ir nextToken ()).

Kaip pastebėjote, „PowerfulTokenizer“ įgyvendina Surašymas sąsają, taip įgyvendindami hasMoreElements () ir nextElement () metodai, kurie tiesiog perduoda skambutį hasMoreTokens () ir nextToken (), atitinkamai. (Įgyvendinant Surašymas sąsaja, „PowerfulTokenizer“ tampa suderinama su „StringTokenizer“.) Panagrinėkime pavyzdį. Tarkime, kad įvesties eilutė yra "sveiki, šiandien ,,, \" Aš, esu ", einu į ,,, \" pirkti, a, knygą \ "" ir ribotuvas yra ,. Kai simbolizuota ši eilutė grąžina reikšmes, kaip parodyta 1 lentelėje:

1 lentelė. Vertės, grąžintos naudojant žetonų eilutę
TipasŽetonų skaičiusŽetonai

„StringTokenizer“

(bReturnTokens = tiesa)

19sveiki:,: Šiandien:,:,:,: "Aš:,: am":,: einu į:,:,:,: "pirkti:,: a:,: knyga" (čia personažas : atskiria žetonus)

„PowerfulTokenizer“

(bReturnTokens = tiesa)

13labas:,: Šiandien:,: "": "": Aš, esu:,: einu į:,: "": "": nusipirk knygą (kur "" reiškia 0 ilgio eilutę)

„PowerfulTokenizer“

(bReturnTokens = klaidinga)

9labas: Šiandien: "": "": Aš: ketinu: "": "": nusipirkti knygą

Įvesties eilutėje yra 11 kablelių (,) simboliai, iš kurių trys yra vidiniuose pakraščiuose ir keturi iš eilės (kaip Šiandien ,,, du kartus iš eilės rodomi kableliai, pirmasis yra kablelis Šiandienribotuvas). Čia pateikiama logika skaičiuojant žetonų skaičių „PowerfulTokenizer“ atvejis:

  1. Jeigu bReturnTokens = tiesa, padauginkite atskyriklių skaičių poskyriuose iš 2 ir atimkite tą sumą iš faktinio viso, kad gautumėte žetonų skaičių. Priežastis yra substringas „pirkti, knygą“, „StringTokenizer“ grąžins penkis žetonus (t. y. pirkti:,: a:,: knyga), o „PowerfulTokenizer“ grąžins vieną žetoną (t. y. pirkti, a, knyga). Skirtumas yra keturi (t. Y. 2 * atskyriklių skaičius substringo viduje). Ši formulė tinka bet kokiam substratui, kuriame yra atskyriklių. Žinokite apie ypatingą atvejį, kai pats žetonas yra lygus atribotojui; tai neturėtų sumažinti skaičiavimo vertės.
  2. Panašiai ir dėl bReturnTokens = klaidinga, iš faktinės sumos (19) atimkite išraiškos vertę [iš viso atribotojai (11) - iš eilės skiriamieji skyrikliai (4) + atribotojų skaičius pakraščiuose (3)] iš faktinės sumos (19). Kadangi šiuo atveju mes negrąžiname ribotuvų, jie (neatrodydami iš eilės ar vidinių pakraščių viduje) mums nenaudingi, o aukščiau pateikta formulė nurodo bendrą žetonų skaičių (9).

Prisiminkite šias dvi formules, kurios yra pagrindinė „PowerfulTokenizer“. Šios formulės tinka beveik visais atitinkamais atvejais. Tačiau jei turite sudėtingesnių reikalavimų, kurie netinka šioms formulėms, prieš pradėdami koduoti, turite apsvarstyti įvairius pavyzdžius, kad sukurtumėte savo formulę.

 // patikrinkite, ar atribiklis yra (int i = 1; i

nextToken () metodas gauna žetonus naudodamas StringTokenizer.nextTokenir patikrina, ar žetone nėra dvigubos citatos simbolio. Jei metodas randa tuos simbolius, jis gauna daugiau žetonų, kol neranda nė vieno su dviguba citata. Jis taip pat saugo žetoną kintamajame (sPrevToken; žr. šaltinio kodą), norėdami patikrinti iš eilės skiriamųjų elementų išvaizdą. Jei nextToken () suranda iš eilės žetonus, kurie yra lygūs atribotojui, tada jis grįžta "" (eilutė, kurios ilgis 0) kaip žetonas.

Panašiai hasMoreTokens () metodas patikrina, ar jau prašytų žetonų skaičius yra mažesnis nei bendras žetonų skaičius.

Sutaupykite kūrimo laiko

Šis straipsnis išmokė, kaip lengvai parašyti galingą žymeklį. Naudodamiesi šiomis sąvokomis, galite greitai parašyti sudėtingus žymenis, taip sutaupydami daug laiko kūrimui.

Bhabani Padhi yra „Java“ architektas ir programuotojas, šiuo metu dirbantis žiniatinklio ir įmonės programų kūrimo srityje naudojant „Java“ technologiją „UniteSys“, Australijoje. Anksčiau jis dirbo „Baltimore Technologies“, Australijoje, kurdamas e. Saugumo produktus, ir „Fujitsu“, Australijoje, vykdydamas EJB serverių kūrimo projektą. „Bhabani“ interesai apima paskirstytą skaičiavimą, mobilųjį ir internetinių programų kūrimą naudojant „Java“ technologiją.

Sužinokite daugiau apie šią temą

  • Gaukite šio patarimo šaltinio kodą

    //images.techhive.com/downloads/idge/imported/article/jvw/2001/06/powerfultokenizer.java

  • Norėdami gauti daugiau informacijos apie „BreakIterator“

    //java.sun.com/products/jdk/1.2/docs/api/java/text/BreakIterator.html

  • Peržiūrėti visus ankstesnius „Java“ patarimai ir pateik savo

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Daugiau Įvadinis lygis straipsnius, apsilankykite „JavaWorld“s aktuali rodyklė

    //www.javaworld.com/javaworld/topicalindex/jw-ti-introlevel.html

  • Sužinokite „Java“ iš pagrindų „JavaWorld“s „Java 101“ stulpelį

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • „Java“ ekspertai atsako į jūsų sunkiausius „Java“ klausimus „JavaWorld“s „Java“ klausimai ir atsakymai stulpelį

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Prisiregistruokite „JavaWorld“ šią savaitę nemokamas savaitinis naujienlaiškis el. paštu, kad sužinotumėte, kas naujo „JavaWorld“

    //www.idg.net/jw-subscribe

Šią istoriją „Java Tip 112: Improve tokenization of rich information stings“ iš pradžių paskelbė „JavaWorld“.