sortowanie słów c#

0

Witam! Jestem początkującą programistką i szukam porady. Mam do napisania projekt przeszukiwarki plików *.txt. Napotkałam pewien problem i prosiła bym o pomoc w jego rozwiązaniu. Mianowicie metoda która ma wypisać mi wszystkie słowa z pliku(które wcześniej umieściłam w richTextBox) wg malejącej ilości wystąpień nie działa poprawnie. Bardzo proszę o pomoc i z góry dziękuję.

int[] iloscslow;
            iloscslow = new int[100000];
            string[] slowo;
            slowo = new string[100000];
            for (int i = 0; i < richTextBox2.Lines.Length-1; i++)
            {
                string Linia = richTextBox2.Lines[i];
                string[] slowa = Linia.Split(new Char[] { ' ', ',', '.', ':', '!', '?', '/', '{', '}', '[', ']', '(', ')', '-', '+', '=', '*', '\t' });
                for (int j = 0; j < slowa.Length; j++)
                {
                    int a = 0;
                    foreach (string wyraz in slowa)
                        {
                            if (slowo[a] != wyraz)
                            {
                                slowo[a] = wyraz;
                                iloscslow[a] = 1;
                                a++;
                            }
                            else
                            {
                                iloscslow[a]++;
                                a++;
                            }
                        }
                    }
                }
                for ( int a = 0; a < slowo.Length; a++)
                {
                    richTextBox5.AppendText(iloscslow[a] + " " + slowo[a] + Environment.NewLine);
                }  
0

Sugeruję odpalić metodę Split z drugim argumetntem StringSplitOptions.RemoveEmptyEntries, dzięki temu nie będzie w wyniku "pustych słów".

Sprawa druga - po co Ci ten foreach wewnątrz for, skoro w obu pętlach poruszasz się po tej samej tablicy?

To, czego Ty potrzebujesz to słownik, który dla danego słowa (ono jest kluczem słownika) przypisze liczbę jego wystąpień (która będzie wartością słownika) i jedna pętla, która przejdzie po wszystkich słowach i je policzy. Coś w tym stylu:

Dictionary<string, int> stats = new Dictionary<string, int>();

... w pętli for  idącej po liniach TextBoxa:

string[] words = richTextBox2.Lines[i].Split(new char[] { ' ', '\n', '\r', '\t', '\\', '/', '\'', '"',  '.', ',', ':', ';', '?', '!', '-', '(', ')', '[', ']' }, 
                StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < words.Length; i++)
{
    words[i] = words[i].ToLower();

    if (stats.ContainsKey(words[i]))
    {
        stats[words[i]]++;
    }
    else
    {
        stats[words[i]] = 1;
    }
}

Wynik masz w zmiennej stats.

0

Dzięki za wskazówki ;) Teraz to już przynajmniej wiem jak to zrobić ;)

1
new char[] { ' ', '\n', '\r', '\t', '\\', '/', '\'', '"',  '.', ',', ':', ';', '?', '!', '-', '(', ')', '[', ']' }

można też tak:

" \n\r\t\\/'\".,:;?!-()[]".ToCharArray()

1 użytkowników online, w tym zalogowanych: 0, gości: 1