Avatar billede Slettet bruger
03. august 2006 - 18:40 Der er 30 kommentarer og
1 løsning

Dynamisk ArrayList, muligt?

Jeg har lavet min egen klasse, som jeg bruger som et multidimentionelt array, med arraylists. Hver arraylist er en column.

Men på den måde har mit array et fast antal columns. Er det muligt at oprette og bruge Arraylists dynamisk?

Grunden til det er lavet sådan er, så man kan fjerne hele rækken, unden at skulle rykke alt indhold op når noget fjernes, som i et almindeligt array
Avatar billede nielle Nybegynder
03. august 2006 - 19:06 #1
Du kan jo bare smide dine ArrayLists i endnu en ArrayList. :^)
Avatar billede Slettet bruger
03. august 2006 - 19:40 #2
hmm, har du et eksempel?
Avatar billede overload.dk Nybegynder
03. august 2006 - 19:48 #3
ArrayList MinFoersteArrayListe = new ArrayList();
        ArrayList MinAndenArrayListe = new ArrayList();

        //Hælder lidt i nummer 2 arrayliste:
        MinAndenArrayListe.Add("hej");
        MinAndenArrayListe.Add("med");
        MinAndenArrayListe.Add("dig");

        //Smider nummer 2 arrayliste ind i 1'eren:
        MinFoersteArrayListe.Add(MinAndenArrayListe);
Avatar billede nielle Nybegynder
03. august 2006 - 19:52 #4
Hvor mange dimensioner har dit multidomensionelle array?
Avatar billede Slettet bruger
03. august 2006 - 19:53 #5
Men hvordan kan jeg så lave en constructer hvor jeg kan indtaste hvor mange columns der skal være, og så opretter den det?
Avatar billede nielle Nybegynder
03. august 2006 - 20:04 #6
Hvordan definere du dit multidimesnionelle array lige nu?
Avatar billede Slettet bruger
03. august 2006 - 20:56 #7
MultiArray UserInfoTable = new MultiArray();
Avatar billede nielle Nybegynder
03. august 2006 - 21:02 #8
Hvordan er din klasse ArrayList defineret?
Avatar billede Slettet bruger
03. august 2006 - 21:09 #9
kan du adde mig på msn eller noget? så kunne jeg sende klassen
Avatar billede nielle Nybegynder
03. august 2006 - 21:14 #10
Desværre, bruger ikke MSN eller anden form for IM. Det ville da også være synd hvis andre ikke kunne følge med her. :^)

Men du behøver nu heller ikke poste hele klassen, kun den del hvor at det indre multi-dimensionelle array bliver defineret.
Avatar billede Slettet bruger
03. august 2006 - 21:21 #11
Det er såmændt bare sådan her:

namespace p2p
{
    class MultiArray
    {
        ArrayList Array1 = new ArrayList();
        ArrayList Array2 = new ArrayList();
        ArrayList Array3 = new ArrayList();
        ArrayList Array4 = new ArrayList();
       
       
        public MultiArray()
        {

        }

        public void Add(Object arg1, Object arg2, Object arg3, Object arg4)
        {
            Array1.Add(arg1);
            Array2.Add(arg2);
            Array3.Add(arg3);
            Array4.Add(arg4);
        }
Avatar billede nielle Nybegynder
03. august 2006 - 21:31 #12
F.eks. sådan:

    class Program
    {
        static void Main(string[] args)
        {
            MultiArray multiArray = new MultiArray(4);
        }
    }

    class MultiArray
    {
        ArrayList[] ArrayX = null;

        public MultiArray(uint dim)
        {
            ArrayX = new ArrayList[dim];
        }

        public void Add(params Object[] arg)
        {
            for (int idx = 0; idx < arg.Length; idx++)
            {
                if (idx >= ArrayX.Length) break;
                ArrayX[idx].Add(arg[idx]);
            }
        }
    }
Avatar billede Slettet bruger
03. august 2006 - 21:58 #13
ArrayX[idx].Add(arg[idx]);

Den siger: Object reference not set to an instance of an object.
Avatar billede nielle Nybegynder
03. august 2006 - 22:05 #14
Min fejl. Constructoren skal set sådan her ud:

        public MultiArray(uint dim)
        {
            ArrayX = new ArrayList[dim];
            for (int idx = 0; idx < ArrayX.Length; idx++)
                ArrayX[idx] = new ArrayList();
        }
Avatar billede Slettet bruger
03. august 2006 - 22:09 #15
super, nu virker det skam :) kan i hvert fald smide værdier ind.

Jeg havde sådan en før:

public Object GetItemAt(int Index, int Column)
        {
            Object ReturnValue = null;

            switch (Column)
            {
                case 1:
                    ReturnValue = Array1[Index];
                    break;
                case 2:
                    ReturnValue = Array2[Index];
                    break;
                case 3:
                    ReturnValue = Array3[Index];
                    break;
                case 4:
                    ReturnValue = Array4[Index];
                    break;
            }

            return ReturnValue;
        }


skal bruge noget i den retning jo.. kan ikke rigtig se logikken i det med et arraylist i et arraylist. Skal have lave flere funktioner, men hvis du ville må du meget gerne vise hvordan jeg så hiver værdier ud, fra den forskellige columns via index
Avatar billede nielle Nybegynder
03. august 2006 - 22:17 #16
Den løsning du har fået bruger nu ikke ArrayList i ArrauList, men bloe ArrayList i Array.

Din funktion, oversat:

        public Object GetItemAt(int Index, int Column)
        {
            if (Column >= ArrayX.Length)
                return null;

            if (Index >= ArrayX[Column].Count)
                return null;

            return ArrayX[Column][Index];
        }
Avatar billede nielle Nybegynder
03. august 2006 - 22:18 #17
Der var iøvrigt en fejl i din egen kode. Når du har 4 ArrayLists, vil column gå fra 0-3, og ikke 1-4.
Avatar billede Slettet bruger
03. august 2006 - 22:19 #18
nej, det er jeg klar over, tænkte ikke på 0 "standarden" da jeg lavede det, og så var jeg for doven til at lave om i koden:P
Avatar billede md_craig Nybegynder
04. august 2006 - 12:16 #19
nielle >>

Det passer da ikke når collum ikke er et index i et array i hans tilfælde... metoden kunne se sådan her ud og ville være det samme...

public Object GetItemAt(int Index, int Column)
        {
            Object ReturnValue = null;

            switch (Column)
            {
                case 13:
                    ReturnValue = Array1[Index];
                    break;
                case 28:
                    ReturnValue = Array2[Index];
                    break;
                case 3243:
                    ReturnValue = Array3[Index];
                    break;
                case 4187:
                    ReturnValue = Array4[Index];
                    break;
            }
            return ReturnValue;
        }

Eller med bogstaver eller whatever... så der er da ingen fejl i hans kode...
Avatar billede nielle Nybegynder
04. august 2006 - 16:53 #20
Næ, det har du jo faktisk ret i.

Column referere til det implicitte søjlenavn i Array1, Array2, Array3 og Array4. Det er først når man indføre et indeks på søjlen at det starter med 0.

... men dine cases ovenfor vil nu bare resultere i at GetItemAt returnere null, med mindre man altså antager at søjlen nr. 1 har column-nr. 13.
Avatar billede md_craig Nybegynder
05. august 2006 - 01:28 #21
Ja man vil naturligvis skulle tilgå det eksempel med:

GetItemAt(13,xx);
GetItemAt(28,xx);
GetItemAt(3243,xx);
GetItemAt(4187,xx);

Og det kan vi hurtigt blive enige om er uhensigtsmesigt...

Om så 0-3 eller 1-4 er bedst, er der sikkert mange der kan diskutere om... og på det punkt tillader jeg mig at være pasiv... med kun en ting at sige, og det er at man nok bør sigte efter hvad der er normen i det miljø man programmere i (i det her tilfælde C#/.NET , hvor 0-3 vil være normen)...

Men at man ikke ville kunne finde gode argumenter for 1-4 indexses... det vil være lidt naivt at udelukke tror jeg...

I sidste ende så bare fordi kode måske ikke er logisk for mange, ikke lig med at det er fejlkode :P...
Avatar billede Slettet bruger
05. august 2006 - 12:27 #22
nielle, læg et svar så får du point ;)
Avatar billede nielle Nybegynder
05. august 2006 - 12:48 #23
05/08-2006 01:28:40> Jeg kan kun erklære mig enig :^)

... og et svar :^)
Avatar billede Slettet bruger
05. august 2006 - 13:13 #24
Det virker faktisk super godt, har fået lavet en hel klasse til at manipulere det dynamiske arraylist. Præcis det jeg ville!:)

Mangler lige en ting, som Add funktionen, skal jeg bruge en Insert funktion, der indsætter en række ved et bestemt index, ville lige hører om du mener det her er den rigtige måde at gøre det på?

        public void InsertAt(int Index, params Object[] arg)
        {
            for (int idx = 0; idx < arg.Length; idx++)
            {
                if (idx >= ArrayX.Length) break;
                ArrayX[idx].Insert(Index, arg[idx]);
            }
        }



og lige ledes med clear funktionen:

        public void Clear()
        {
            for (int idx = 0; idx < ArrayX.Length; idx++)
            {
                ArrayX[idx].Clear();
            }
        }
Avatar billede nielle Nybegynder
05. august 2006 - 13:23 #25
Ja, det ser rigtigt nok ud. :^)
Avatar billede Slettet bruger
05. august 2006 - 14:19 #26
Okai takker, poster lige min klasse hvis andre skulle få brug for det:

    class MultiArray
    {
        ArrayList[] ArrayX = null;

        public MultiArray(uint dim)
        {
            ArrayX = new ArrayList[dim];
            for (int idx = 0; idx < ArrayX.Length; idx++)
                ArrayX[idx] = new ArrayList();
        }

        public void Add(params Object[] arg)
        {
            for (int idx = 0; idx < arg.Length; idx++)
            {
                if (idx >= ArrayX.Length) break;
                ArrayX[idx].Add(arg[idx]);
            }
        }

        public void InsertAt(int Index, params Object[] arg)
        {
            for (int idx = 0; idx < arg.Length; idx++)
            {
                if (idx >= ArrayX.Length) break;
                ArrayX[idx].Insert(Index, arg[idx]);
            }
        }

        public Object GetItemAt(int Column, int Index)
        {
            return ArrayX[Column][Index];
        }

        public void EditValue(int Column, int Index, Object Value)
        {
            ArrayX[Column][Index] = Value;
        }

        public void RemoveAt(int Index)
        {
            for (int i = 0; i < ArrayX.Length; i++)
            {
                ArrayX[i].RemoveAt(Index);
            }
        }

        public void Remove(Object Item)
        {
            int Index = ArrayX[0].IndexOf(Item);
           
            for (int i = 0; i < ArrayX.Length; i++)
            {
                ArrayX[i].RemoveAt(Index);
            }
        }

        public int IndexOf(Object Item, int Column)
        {
            return ArrayX[Column].IndexOf(Item);
        }

        public bool Contains(int Colum, Object Item)
        {
            return ArrayX[Colum].Contains(Item);
        }

        public void Clear()
        {
            for (int idx = 0; idx < ArrayX.Length; idx++)
            {
                ArrayX[idx].Clear();
            }
        }

        public int Count()
        {
            return ArrayX[1].Count;
        }
    }
Avatar billede md_craig Nybegynder
05. august 2006 - 17:46 #27
Der er måske et par ting jeg ikke helt forstår ved den klasse... og som jeg måske ville lave anderledes...

public int Count()
{
  return ArrayX[1].Count;
}

Jeg ville måske have antaget at den skulle returnere det samlede antal elementer, og ikke antal colloner? Altså:

public int Count()
{
  int cnt = 0;
  foreach(ArrayList al in ArrayX)
    cnt += al.Count;
  return cnt;
}

Og så måske tilføje count på Collums/Rows...

public int CountRow(int row)
{
  return ArrayX[row].Count;
}

----

en anden ting jeg ikke helt forstår er Insæt vs Remove

når du insætter insætter du et Array spredt ud over dine forskellige ArrayLists... Men både Remove og Contains kigger aldrig ud over den første liste... Sådan som jeg lige kan overskue koden i black&white Givet et eks:

Add({1,2,3});
Add({4,5,6});
Add({7,8,9});

Må give:

1  4  7
2  5  8
3  6  9

Nu prøver vi så at kalde:

Remove(6);
og nu ser det således ud:

1  4  7
2  5  8
3  6  9

Intet blev fjernet... Til trods for at Contains(2,6); giver true...
så prøver vi med:
Remove(4);

Og vi får

1  7
2  8
3  9

Det er ikke helt logisk for mit hoved hvertfald...
foruden at der nok skal noget Exception Casting ect til... Så man er klar over når man prøver at tilføje et Array med flere elementer end der er collums... (Frem for bare at smide resten væk)...

Kan godt være jeg bare har misforstået ideen med det her... men var da et par ting jeg studsede over...
Avatar billede Slettet bruger
05. august 2006 - 18:57 #28
Hvor starter jeg :)

Count() funktionnen skal retunere hvor mange rows der er i mit array, ikke columns.

Så vidt jeg har testet virker Add og Remove til at gøre de rigtige ting.. jeg lavede et projekt for at teste det, og det har jeg ikke her, så hvis jeg skal være sikker må det vente til på mandag
Avatar billede md_craig Nybegynder
06. august 2006 - 02:02 #29
ok... nu kommer row's og collums jo 100% på ens opfattelse af tingene...

Jeg ser det jo således:

ArrayList Array
[0] - > ArrayList (Colums)
[1] - > ArrayList (Colums)
[2] - > ArrayList (Colums)
[3] - > ArrayList (Colums)

Men taget i betragtning at X/Y Axer er det jo faktisk en smule forkert...

Men spørgsmålet er... hvad ser du som collums?...
Det svarer du måske bedst ud fra din add metode...

Hvad er det du forventer at tilføje der?... en Collum eller en Row???
Avatar billede Slettet bruger
06. august 2006 - 10:10 #30
Jeg ser det som i et Listview:

    col0  col1 col2  col3
row0 [0]  [1]  [2]  [3]
row1 [1] 
row2 [2]
row3 [3]
Avatar billede md_craig Nybegynder
09. august 2006 - 21:41 #31
Ja det hjalp ikke meget mere...

Ser du hvert enkelt Array List som en Column, eller som en Row? (Prøver lige at lave en tegning senere)
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