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ų:
„StringTokenizer“ („String sInput“)
: Pertraukos tarpuose ("", "\ t", "\ n"
).„StringTokenizer“ („String sInput“, „String sDelimiter“)
: PertraukossDelimiteris
.„StringTokenizer“ („String sInput“, „String sDelimiter“, „Boolean bReturnTokens“)
: PertraukossDelimiteris
, bet jeibReturnTokens
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
, leidinys
ir 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:
Tipas | Žetonų skaičius | Žetonai |
---|---|---|
| 19 | sveiki:,: Šiandien:,:,:,: "Aš:,: am":,: einu į:,:,:,: "pirkti:,: a:,: knyga " (čia personažas : atskiria žetonus) |
| 13 | labas:,: Šiandien:,: "": "": Aš, esu:,: einu į:,: "": "": nusipirk knygą (kur "" reiškia 0 ilgio eilutę) |
| 9 | labas: Š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 Šiandien
ribotuvas). Čia pateikiama logika skaičiuojant žetonų skaičių „PowerfulTokenizer“
atvejis:
- 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. - 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; iThe
countTokens()
method checks whether the input string contains double quotes. If it does, then it decrements the count and updates the index to the index of the next double quote in that string (as shown in the above code segment). IfbReturnTokens
is false, then it decrements the count by the total number of nonsubsequent delimiters present in the input string.// return " "="" as="" token="" if="" consecutive="" delimiters="" are="" found.="" if="" (="" (sprevtoken.equals(sdelim))="" &&="" (stoken.equals(sdelim))="" )="" {="" sprevtoken="sToken;" itokenno++;="" return="" "";="" }="" check="" whether="" the="" token="" itself="" is="" equal="" to="" the="" delimiter="" if="" (="" (stoken.trim().startswith("\""))="" &&="" (stoken.length()="=" 1)="" )="" {="" this="" is="" a="" special="" case="" when="" token="" itself="" is="" equal="" to="" delimiter="" string="" snexttoken="oTokenizer.nextToken();" while="" (!snexttoken.trim().endswith("\""))="" {="" stoken="" +="sNextToken;" snexttoken="oTokenizer.nextToken();" }="" stoken="" +="sNextToken;" sprevtoken="sToken;" itokenno++;="" return="" stoken.substring(1,="" stoken.length()-1);="" }="" check="" whether="" there="" is="" a="" substring="" inside="" the="" string="" else="" if="" (="" (stoken.trim().startswith("\""))="" &&="" (!((stoken.trim().endswith("\""))="" &&="" (!stoken.trim().endswith("\"\""))))="" )="" {="" if="" (otokenizer.hasmoretokens())="" {="" string="" snexttoken="oTokenizer.nextToken();" check="" for="" presence="" of="" "\"\""="" while="" (!((snexttoken.trim().endswith("\""))="" &&="" (!snexttoken.trim().endswith("\"\"")))="" )="" {="" stoken="" +="sNextToken;" if="" (!otokenizer.hasmoretokens())="" {="" snexttoken="" ;="" break;="" }="" snexttoken="oTokenizer.nextToken();" }="" stoken="" +="sNextToken;" }="" }="">
nextToken ()
metodas gauna žetonus naudodamas StringTokenizer.nextToken
ir 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“.