Avatar billede baitianlong Nybegynder
21. november 2005 - 05:58 Der er 10 kommentarer og
1 løsning

Liste af ord skal tælles

http://www.eksperten.dk/spm/666080

Jeg troede jeg var smart, men det var jeg ikke... Kan nogen hjælpe til at lave det lidt mindre processorkrævende.
Avatar billede iblarsen Praktikant
21. november 2005 - 06:00 #1
En mulig løsning kunne være at du i din klasse. Sortere array'et - og der efter gennem løber det. Så er der kun et gennem løb. Så er det bare at tælle ord op - og hver gang der kommer et ny ord, startes en ny optælling.
Avatar billede baitianlong Nybegynder
21. november 2005 - 06:29 #2
Jeg er gået helt kold i det nu. Jeg synes din ide lyder fin nok... Hvordan ser det her ud for dig:

words.Sort();
object[] wordarray = words.ToArray();
int antal = 0;
for(int i = 0; i < wordarray.Length; i++)
{
    if(!wordarray[i+1].Equals(wordarray[i]))
    {
        wordcontainer.Add(new Wordnumber(wordarray[i].ToString(), antal));
        antal = 1;
    }
    else
    {
        antal++;
    }
}

?!?!?
Avatar billede iblarsen Praktikant
21. november 2005 - 06:36 #3
Jeg tænkter nærmere på noget i denne retning:

string saveOrd = "";
int antal = 0;
words.Sort();
string[] wordarray = words.ToArray();
for (int i = 0 i < wordarray.Length; i++)
{
  if (wordarray[i] != saveOrd)
  {
    wordcontainer.Add(new Wordnumber(savOrdToString(), antal));
    antal = 1;
    saveOrd = wordarray[i];
  }
  else
    antal += 1;
}
wordcontainer.Add(new Wordnumber(wordarray[wordarray.Length].ToString(), antal));

Det kan godt være du skal pille lidt ved index'erne
Avatar billede Slettet bruger
21. november 2005 - 06:37 #4
Du skal bruge en HashTable.

Du gennemløber din arraylist og for hver ord tilføjer to til Hashtable.

Inden du tilføjer checker du om ordet allerede findes i hashtable og hvis det gør lægger du en til value.

Altså Hashtable hvor Key = dit ord Value = antal gange det er set.
Avatar billede baitianlong Nybegynder
21. november 2005 - 06:47 #5
Den var jeg også ude i, men gik desværre ret hurtigt kold:

object[] wordarray = words.ToArray();
for(int i = 0; i < wordarray.Length; i++)
{
    if(wordcontainer.ContainsKey(s))
    {
        wordcontainer.øhhhhhhhh...

Kan du prøve at hjælpe med den ?

iblarsen -> Jeg kan heller ikke få den til at virke med dit forslag. Prøvede således:

string saveOrd = "";
int antal = 0;
words.Sort();
object[] wordarray = words.ToArray();
for (int i = 0; i < wordarray.Length; i++)
{
    if (!wordarray[i].Equals(saveOrd))
    {
        wordcontainer.Add(new Wordnumber(saveOrd.ToString(), antal));
        antal = 1;
        saveOrd = wordarray[i].ToString();
    }
    else
        antal += 1;
}
wordcontainer.Add(new Wordnumber(wordarray[wordarray.Length].ToString(), antal));

DataGrid1.DataSource = null;
DataGrid1.DataSource = wordcontainer;
DataGrid1.DataBind();

Men får hele tiden exceptions i hovedet.
Avatar billede baitianlong Nybegynder
21. november 2005 - 06:48 #6
nårh ja, kryptos, i ovenstående eksempel HAR jeg ændret wordcontainer til Hashtable :)
Avatar billede baitianlong Nybegynder
21. november 2005 - 06:55 #7
hovsa... lidt forkert antal undo/redo: words er ArrayListen med mine ord

words.Sort();
foreach(string s in words)
{
    if(wordcontainer.ContainsKey(s))
    {
        wordcontainer.......
Avatar billede baitianlong Nybegynder
21. november 2005 - 07:06 #8
Ja ja, næste skridt er blevet taget :)

foreach(string s in words)
{
    if(!wordcontainer.ContainsKey(s))
    {
        wordcontainer.Add(s, 1);
    }
    else
    {
        wordcontainer.LÆG EN TIL VALUE PÅ KEY s
    }
}
Avatar billede baitianlong Nybegynder
21. november 2005 - 07:30 #9
Der står flere steder, jeg har kigget at hashtable.Item(key) er måden at få fat i et element i hashtable, men Item eksisterer ikke i mit .net framework (1.1) Jeg fatter minus.
Avatar billede baitianlong Nybegynder
21. november 2005 - 07:58 #10
Nå, det skulle skrives sådan her (tror jeg)

foreach(string s in words)
{
    if(!wordcontainer.ContainsKey(s))
    {
        wordcontainer.Add(s, 1);
    }
    else
    {
        wordcontainer[s] = (int) wordcontainer[s] + 1;
    }
}
Avatar billede arne_v Ekspert
21. november 2005 - 09:19 #11
jeg lavede i august dette lille stykke kode:

using System;
using System.Collections;

public class WordCount : IComparable
{
    string word;
    int count;
    public WordCount(string word)
    {
        this.word = word;
        this.count = 1;
    }
    public string Word
    {
        get
        {
            return word;
        }
    }
    public int Count
    {
        get
        {
            return count;
        }
    }
    public void Increment()
    {
        count++;
    }
    public int CompareTo(object o)
    {
        return ((WordCount)o).Count - count;
    }
}

public class WordCountList
{
    private Hashtable list;
    private int minlen;
    public WordCountList(int minlen)
    {
        this.list = new Hashtable();
        this.minlen = minlen;
    }
    public void AddWord(string word)
    {
        if(word.Length >= minlen)
        {
            if(list.ContainsKey(word))
            {
                ((WordCount)list[word]).Increment();
            }
            else
            {
                list.Add(word, new WordCount(word));
            }
        }
    }
    public void AddText(string text)
    {
        string[] words = text.Split(" ".ToCharArray());
        for(int i = 0; i < words.Length; i++)
        {
            AddWord(words[i]);
        }
    }
    public ICollection GetTop(int n)
    {
        ArrayList temp = new ArrayList();
        temp.AddRange(list.Values);
        temp.Sort();
        temp.RemoveRange(n, temp.Count - n);
        return temp;
    }
}

class TestClass
{
    public static void Test(string s)
    {
        WordCountList proc = new WordCountList(1);
        proc.AddText(s);
        ICollection top = proc.GetTop(3);
        foreach(WordCount wc in top)
        {
            Console.WriteLine(wc.Word + " : " + wc.Count);
        }
    }
    public static void Main(string[] args)
    {
        Test(@"Dette er en lille test - er en en");
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester