Avatar billede tl Nybegynder
03. februar 2005 - 23:16 Der er 6 kommentarer og
1 løsning

Finde flest instanser i en Array..

Givet man har en array eller arraylist af 1000 nogenlunde ens objecter i .NET (c#)- er der en enkel måde at man kan finde hvilke af objecterne der har flest instanser i array'en. Altså den med størst frekvens.

Skal bruge det til noget statistik... hmmm... en lidt svær nød..
Avatar billede arne_v Ekspert
03. februar 2005 - 23:32 #1
Jeg er overbevist om at det kan gøres smartere. Men her er et
forslag:

using System;
using System.Collections;

class MainClass
{
    public static Object MaxOccur(ArrayList list)
    {
        Hashtable ht = new Hashtable();
        for(int i = 0; i < list.Count; i++)
        {
            Object o = list[i];
            if(ht.ContainsKey(o)) {
                int n = (int)ht[o];
                ht.Remove(o);
                ht.Add(o, n + 1);
            }
            else
            {
                ht.Add(o, 1);
            }
        }
        int maxn = 0;
        Object maxo = null;
        IDictionaryEnumerator en = ht.GetEnumerator();
        while(en.MoveNext())
        {
            if((int)en.Value > maxn)
            {
                maxn = (int)en.Value;
                maxo = en.Key;
            }
        }
        return maxo;
    }
    public static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        list.Add("A");
        list.Add("BB");
        list.Add("CCC");
        list.Add("BB");
        list.Add("A");
        list.Add("A");
        list.Add("BB");
        list.Add("BB");
        Object o = MaxOccur(list);
        Console.WriteLine(o);
    }
}
Avatar billede tl Nybegynder
04. februar 2005 - 15:57 #2
ok... det vil jeg da lige prøve... Der skulle være et standard api ligesom Sort til dette... prøver taK!.
Avatar billede arne_v Ekspert
04. februar 2005 - 18:45 #3
et svar i forventning om at det virker
Avatar billede burningice Nybegynder
05. februar 2005 - 03:31 #4
og hvis det er type du vil have antallet af kan du bruge denne istedet

using System;
using System.Collections;

namespace _587806
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            ArrayList arr = new ArrayList();
            arr.Add(new A());
            arr.Add(new A());
            arr.Add(new B());
            arr.Add(new C());

            Type t = Max(arr);

            Console.WriteLine(t.Name);

            Console.ReadLine();
        }

        static Type Max(ArrayList arr)
        {
            Hashtable table = new Hashtable();

            foreach (object o in arr)
            {
                Type t = o.GetType();
                if (table.ContainsKey(t))
                {
                    int number = (int)table[t];
                    table.Remove(t);
                    table.Add(t, number + 1);
                }
                else
                {
                    table.Add(t, 1);
                }
            }
           
            int maxNumber = 0;
            Type maxType = null;

            IDictionaryEnumerator en = table.GetEnumerator();
            while(en.MoveNext())
            {
                if((int)en.Value > maxNumber)
                {
                    maxNumber = (int)en.Value;
                    maxType = (Type)en.Key;
                }
            }

            return maxType;
        }
    }

    class A {}

    class B {}

    class C {}
}
Avatar billede tl Nybegynder
05. februar 2005 - 19:24 #5
Tak... Det funkede!
Avatar billede arne_v Ekspert
25. februar 2005 - 20:51 #6
tl>

Tid at få afsluttet spørgsmålet ?
Avatar billede tl Nybegynder
26. februar 2005 - 15:30 #7
jo.. sorry.. troede jeg havde fået givet points.

men her er de. Jeg anvender faktisk noget af koden idag..
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