2010. február 27., szombat

Tetszőleges szöveg szavait kigyűjtő algoritmus

Egyedi kereső rendszer fejlesztésénél, vagy statisztikai alkalmazások írásánál hasznos funkció lehet a következő: egy függvénynek megadunk egy tetszőleges szöveget, melyből a függvény kigyűjti a minimum három karakteres szavakat úgy, hogy az eredmény listában minden szó maximum csak egy példányban szerepeljen. További extra lehetőség, hogy megadhatunk egy szó listát, melyben felsorolhatjuk azokat a szavakat, amelyeket nem szeretnénk az eredménylistában látni.
Függvényünk a Split nevet kapta és két paramétert vár: a felbontandó sztringet, valamint azon szavak listáját mely nem kerülhet az eredménybe. Visszatérési értékként egy sztringeket tartalmazó tömbben adja a függvény az eredményt.
private string[] Split(string s, SortedList exclude)
{
Az eredményeket egy SortedList osztályban tároljuk, melybe a sztringek rögtön ABC szerint rendezett formába kerülnek, így a listában történő keresés is gyorsabb lesz.
 SortedList sl = new SortedList();
string tmp = "";
Kezdeményezünk egy ciklust, mely végigmegy a kapott sztring minden karakterén.
 foreach (char c in s)
{
Ha a karakter szám vagy betű, vagy az aláhúzás karakter, akkor azt tároljuk egy átmeneti sztringben.
   if (Char.IsLetterOrDigit(c) || c=='_')
{
tmp += c;
}
Bármi egyéb típusú karakter esetén úgy tekintjük, hogy az adott szó véget ért. Ebben az esetben ellenőrizzük, hogy az adott szó minimum három karakteres-e, vizsgáljuk, hogy van-e már az eredménylistában, mivel oda minden szó csak egy példányba kerülhet. Megnézzük azt is, hogy a szó nem szerepel-e a paraméterként kapott tiltó listán. Ha a szó minden próbált kiállt, csak akkor kerülhet a SortedList elemei közé.
   else
{
if (tmp.Length > 2)
{
if (sl.IndexOfKey(tmp) == -1)
{
if (exclude.IndexOfKey(tmp) == -1)
{
sl.Add(tmp, null);
}
}
}
tmp = "";
}
}
A ciklus futása után már csak elő kell állítanunk egy sztring tömböt a megfelelő tartalommal. Ehhez a SortedList Keys property-jének CopyTo függvényét használjuk, mellyel egy tömbbe másolhatjuk az ott található elemeket.
 string[] result = new string[sl.Count];
sl.Keys.CopyTo(result, 0);
return result;
}
A függvény felhasználása most már egyszerű: létrehozunk egy tiltó listát a szükséges szavakkal, majd meghívjuk a Split függvényt.
private void button1_Click(object sender, System.EventArgs e)
{
SortedList exclude = new SortedList();
exclude.Add("akár", null);
exclude.Add("ahogy", null);
exclude.Add("ahol", null);
exclude.Add("akkor", null);
listBox1.Items.Clear();
listBox1.Items.AddRange(Split(textBox1.Text, exclude));
}
Forrás: http://softwareonline.hu/

0 megjegyzés :

Megjegyzés küldése