[ bciric @ 09.10.2008. 16:28 ] @
Kako da u c# odradim sledeci problem:

Potrebno mi je da za svaki ASCII karatker (cela ASCII tabela) pronadjem broj pojavljivanja u nekom tekstu.
Da li ima neko elegantnije resenje od dve for petlje? odnosno da li neka alatka (textbox, reachtextbox...) ima mogucnosti za brojanje pojavljivanja karaktera?


hvala unapred
[ jablan @ 09.10.2008. 16:36 ] @
Dve fakin petlje?!
[ bciric @ 09.10.2008. 17:10 ] @
Neznam ni kakve su to petlje :).
Ma zanima me neka alatka koja to moze da uradi
[ jablan @ 09.10.2008. 17:24 ] @
Šta će ti alatka za to, to se rešava jednom najprostijom petljom, manje od 10 linija čak i u C#-u. Evo ti rubi verzija pa prevodi, ili guglaj... ;)

>> def br_karaktera tekst
>> res = {}
>> tekst.split('').each{|c| res[c] = res[c] ? res[c] + 1 : 1}
>> res
>> end
>> br_karaktera 'riba ribi grize rep'
=> {" "=>3, "a"=>1, "b"=>2, "z"=>1, "p"=>1, "e"=>2, "g"=>1, "r"=>4, "i"=>4}
[ marko1981 @ 09.10.2008. 20:15 ] @
Citat:

... to se rešava jednom najprostijom petljom ...

Code:

    private const int arraySize = 256;

    public int Char2Ascii(char c)
    {
      return (int)c;
    }

    public char Ascii2Char(int i)
    {
      return (char)i;
    }

    public int[] NumOfChar(string text)
    {
      int[] numOfChar = new int[arraySize];

      for (int i = 0; i < text.Length; i++)
      {
        numOfChar[Char2Ascii(text[i])]++;
      }

      return numOfChar;
    }

    // i na primer upises u neki RichTextBox
    public void InsertTableIntoRichTextBox(string text)
    {
      int[] array = NumOfChar(text);

      for (int i = 0; i < array.Length; i++)
      {
        if (array[i] > 0)
        {
          this.myRichTextBox.AppendText(string.Format("{0} se pojavljuje {1} puta.\n", Ascii2Char(i), array[i]));
        }
      }
    }
[ bciric @ 09.10.2008. 21:49 ] @
hvala

pozz
[ mmix @ 10.10.2008. 00:56 ] @
Mislim da je jablan pre mislio na nesdsot slicno ovome:

Code:

            string tekst;
            Dictionary<char, int> dict = new Dictionary<char, int>(256);
            Console.Write("Tekst: "); tekst = Console.ReadLine();
            foreach (char c in tekst)
                if (dict.ContainsKey(c)) dict[c]++; 
                else dict.Add(c, 1);
            foreach (var hist in dict) Console.WriteLine("'{0}' se pojavljuje {1} puta", hist.Key, hist.Value);
            Console.ReadLine();
            return 0;
[ bciric @ 10.10.2008. 15:53 ] @
e ovo je bas to sto mi treba, havla, ali ako moze jos jedna mala pomoc posto bas ne razumem ovo zadnje.

ja sam taj kod stavio u funkciju:
Code:

        private void BrojKaraktera(string tekst)
        {
            Dictionary<char, int> dict = new Dictionary<char, int>(256);
            foreach (char c in tekst)
                if (dict.ContainsKey(c)) dict[c]++;
                else dict.Add(c, 1);
            foreach (var hist in dict) Console.WriteLine("'{0}' se pojavljuje {1} puta", hist.Key, hist.Value);

        }


e ali bi rezultate smestio u ListView kontrolu, kako da ih izvucem? kako funkcionise ovo :Console.WriteLine("'{0}' se pojavljuje {1} puta", hist.Key, hist.Value);

i ne mogu da definisem hist tipa var, u cemu je problem?


hvala jos jednom
pozz

[Ovu poruku je menjao bciric dana 10.10.2008. u 17:34 GMT+1]
[ mmix @ 10.10.2008. 17:11 ] @
Sto bas ListView (nije bas zgodan za bindovanje)?

U svakom sluicaju mozes da promenis metod da umesto ispisa na konzolu transformise dictionary u List<string> listu koju onda mozes da bindujes gde god zelis:


Code:

        private List<string> BrojKaraktera(string tekst)
        {
            Dictionary<char, int> dict = new Dictionary<char, int>(256);
            foreach (char c in tekst)
                if (dict.ContainsKey(c)) dict[c]++;
                else dict.Add(c, 1);
            var list = from e in dict select string.Format("'{0}' se pojavljuje {1} puta", e.Key, e.Value);
            return list.ToList();
        }
[ Shadowed @ 10.10.2008. 17:52 ] @
Code:

Console.Write("Enter text: ");
Char[] TextChars = Console.ReadLine().ToCharArray();
for (int i = 1; i < 256; i++) {
    int CharCount = 0;
    CharCount = TextChars.Count(c => (int)c == i);
    if (CharCount > 0)
        Console.WriteLine("'{0}' se pojavljuje {1} puta", ((char)i).ToString(), CharCount);
}
Console.ReadLine();


:)
[ mmix @ 10.10.2008. 22:01 ] @
Hehe, a mozemo da iskombinujemo i lambdu i linq da dobijemo resenje bez counter varijabli i state niza gde ce linq da nam grupise i prebroji karaktere

Code:
            Console.Write("Enter text: ");
            var samolinq = from c in Console.ReadLine()
                           group c by c into cgroup
                           orderby cgroup.Key
                           select new { c = cgroup.Key, cnt = cgroup.Count() };
            samolinq.ToList().ForEach(s => Console.WriteLine("'{0}' se pojavljuje {1} puta", s.c, s.cnt));
            Console.ReadLine();
[ bciric @ 13.10.2008. 21:58 ] @
uuuuuuuuaaaaaaaaaaaaaauuuuuuuuuuuu

ovo zadnje jos nisam probao ali mi deluje kao da je to sto mi treba,

hvala svima na korisnim savetima. (jos se i rimuje :))