Avatar billede maxmuldjord Nybegynder
16. oktober 2004 - 17:33 Der er 27 kommentarer og
1 løsning

ArrayList - Er jeg på rette spor?

Jeg skal nu lave en "telefonbog" der kan rumme et navn og et telefonnummer, man skal kunne indtaste navn og nummer samt søge og slette. Se det der falder mig ind er en ArrayList da vi ikke skal anvende en database. Men jeg kan vel ikke umiddelbart indtaste navn og telefonnummer i en ArrayList uden at gøre det i samme streng, kan jeg? Jeg mener f.eks hvis jeg har en klasse eller metode til navn og en til nummer så kan jeg ikke forbinde dem uden et id? Programmet skal indtil videre kører i konsollen men vi skal tage højde for at der skal tilføjes et GUI på et senere tidspunkt, hvad menes der mon med det?
Avatar billede dna Nybegynder
16. oktober 2004 - 17:45 #1
Jeg ville nok oprette et "Person" objekt, hvor du så kan have navn, telefonnummer osv i streng værdier. Disse Personobjekter kan du så gemme i en ArrayList. Så kan du lave en søgning der kan gennemløbe disse objekter!

Så svar til dit spørgsmål.. ja, du kan sagtens være på rette spor! :)

dna
Avatar billede arne_v Ekspert
16. oktober 2004 - 17:49 #2
En ArrayList indeholdende objekter af en klasse X er en mulighed.

En anden mulighed er er type safe collection med objekter af en klasse X.

En tredie emulighed ville være multiple ArrayList en til hver information.

Den sidste kræver mindst kode og er grimmest udfra en objekt orienteret
tankegang.

Den anden kræver mest kode og er pænest.
Avatar billede guidmaster Nybegynder
16. oktober 2004 - 17:59 #3
Du kan finde eksempler på hvordan du bruger de forskellige collections der er i frameworket på http://www.dotnetforum.dk/artikler/collections.aspx
Avatar billede maxmuldjord Nybegynder
16. oktober 2004 - 19:08 #4
hmm.. jeg prøver at bikse lidt med det og poster så lidt kode, Arne, jeg er bange for at det du nævner som mulighed 2 ligger et stykke over mine evner. Men jeg prøver lige at se hvor langt jeg kan komme. Vender frygteligt tilbage her.
Avatar billede maxmuldjord Nybegynder
16. oktober 2004 - 19:42 #5
Jeg prøver lige at bede om en kommentar til disse linier, hvor skal jeg placere min ArrayList? Og jeg skal helst have en klasse til bruger interaktion, dette havde jeg tænkt mig med en switch i min main, lyder det helt gak?

using System;
using System.Collections;

namespace Phonebook
{
   
    class Person

    {
        public static int nameCount=0; //her er det meningen at jeg vil
                                      //tælle hvor mange personer
                                      // der bliver oprettet
   

        public void Names ()
        {
           
            nameCount++;

        }

        public void AddNewName()
        {
            Person.Add(new Person());
            Console.WriteLine("New name added!");
            Printstats();
        }
       
        public void Printstats()
       
        {
        Console.WriteLine("(Number of Names in phonebook" + nameCount);
        }

        [STAThread]
        static void Main(string[] args)
        {
            // her havde jeg tænkt mig min printmenu skulle komme
            //
            //
        }
    }
}
Avatar billede arne_v Ekspert
16. oktober 2004 - 19:47 #6
Prøv lige og se det her eksempel:

using System;
using System.Collections;

class MainClass
{
    public static void Main(string[] args)
    {
        ArrayList lst = new ArrayList();
        lst.Add(new MyData(1));
        lst.Add(new MyData(2));
        lst.Add(new MyData(3));
        for(int i = 0; i < lst.Count; i++)
        {
            MyData md = (MyData)lst[i];
            Console.WriteLine(md.V);
        }
    }
}

public class MyData
{
    private int v;
    public MyData(int v)
    {
        this.v = v;
    }
    public MyData()
    {
        v = 0;
    }
    public int V
    {
        get
        {
            return v;
        }
        set
        {
            v = value;
        }
    }
}
Avatar billede arne_v Ekspert
16. oktober 2004 - 19:49 #7
MyData svarer til din Person. Og du skal så have v/V erstattet af navn/Navn +
tlfnr/Tlfnr etc..

Men din Person klasse er ren data.

Tilføje til liste og udskrive liste ligger udenfor Person.
Avatar billede arne_v Ekspert
16. oktober 2004 - 19:49 #8
Endnu et eksempel:

using System;
using System.Collections;

public class MitObjekt
{
    private int etNummer;
    public MitObjekt(int etNummer)
    {
        this.etNummer = etNummer;
    }
    public int GetObjektNummer()
    {
        return etNummer;
    }
}

public class MitObjektComparer : IComparer
{
    int IComparer.Compare(Object o1, Object o2)  {
        return (((MitObjekt)o1).GetObjektNummer() - ((MitObjekt)o2).GetObjektNummer());
    }
}

class MainClass
{
    public static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        list.Add(new MitObjekt(3));
        list.Add(new MitObjekt(2));
        list.Add(new MitObjekt(1));
        for(int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(((MitObjekt)list[i]).GetObjektNummer());
        }
        list.Sort(new MitObjektComparer());
        for(int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(((MitObjekt)list[i]).GetObjektNummer());
        }
    }
}
Avatar billede maxmuldjord Nybegynder
16. oktober 2004 - 20:06 #9
Tak Arne, Jeg skal lige have dine eksempler skrevet ud og nærlæst, vender tilbage !
Avatar billede maxmuldjord Nybegynder
17. oktober 2004 - 12:21 #10
Nu er jeg kommet (måske) lidt videre men jeg kan ikke rigtigt gennemskue hvordan jeg skal håndtere disse get og set, her er hvad jeg har indtil videre

class Person

    {
        private string name;
        private int phonenumber;

        public Person(string initialName, int initialPhoneNumber)
        {
            name = initialName;
            phonenumber = initialPhoneNumber;
           
        }

        class Book
        {
            private ArrayList names;

            public void Names()
            {
                names = new ArrayList();
                int initialPhoneNumber;
                string initialName;
                Console.WriteLine("Type a name");
                initialName=Convert.ToString(Console.ReadLine());
                Console.WriteLine("Type a phonenumber");
                initialPhoneNumber=Convert.ToInt32(Console.ReadLine());
                names.Add(new Person(initialName,initialPhoneNumber));

            }
        }
   
        [STAThread]
        static void Main(string[] args)
        {
            // her havde jeg tænkt mig min printmenu skulle komme
            //
            //
        }
    }
}
Avatar billede arne_v Ekspert
17. oktober 2004 - 14:13 #11
Book skal flyttes udenfor Person.

Main skal nok i en seperat klasse.

Person skal have tilføjet 2 Properties.
Avatar billede maxmuldjord Nybegynder
17. oktober 2004 - 22:38 #12
jeg har prøvet med følgende men får en fejl omkring liste.Add, hvordan kan jeg evt. udskrive i WriteLine for at se om mine nye person er oprettet i min liste? hvis jeg kan få det til at virke vl at mærke;

class Person
    {
        private string name;
        private string phonenumber;
       
        public string Name
        {
            get {return name;}
            set {name = value;}
        }
        public string PhoneNumber
        {
            get {return phonenumber;}
            set {phonenumber = value;}
        }
        public Person(string initialName, string initialPhoneNumber)
        {
        name=initialName;
        phonenumber=initialPhoneNumber;
        }
       
           
        ArrayList liste=new ArrayList();
        Person p = new Person("viggo","12345678");
       
        liste.Add(new p);
       
        public static void Main(string[] args)
        {
            Console.WriteLine("test");
        }
    }
}
Avatar billede arne_v Ekspert
17. oktober 2004 - 22:41 #13
class Person
    {
        private string name;
        private string phonenumber;
     
        public string Name
        {
            get {return name;}
            set {name = value;}
        }
        public string PhoneNumber
        {
            get {return phonenumber;}
            set {phonenumber = value;}
        }
        public Person(string initialName, string initialPhoneNumber)
        {
        name=initialName;
        phonenumber=initialPhoneNumber;
        }
     
     
        public static void Main(string[] args)
        {
         
        ArrayList liste=new ArrayList();
        liste.Add(new Person("viggo","12345678"));
        liste.Add(new Person("børge","87654321"));
        for(int i=0;i<liste.Count;i++) Console.WriteLine(liste[i]);
        }
    }
}
Avatar billede maxmuldjord Nybegynder
18. oktober 2004 - 11:19 #14
Jeg har lige prøvet, den skriver Phonebook.Person 2 gange
Avatar billede arne_v Ekspert
18. oktober 2004 - 11:55 #15
Lav en ToString metode i din person klasse:

public override string ToString()
{
  return (name + " " + phonenumber);
}
Avatar billede maxmuldjord Nybegynder
18. oktober 2004 - 18:21 #16
Ja, så virker det Arne men kan du forklare hvorfor?
Avatar billede maxmuldjord Nybegynder
18. oktober 2004 - 18:22 #17
Jeg glemte ::::: hvorfor vil det ikke virke med Person p = new Person?
Avatar billede arne_v Ekspert
18. oktober 2004 - 18:34 #18
Console.WriteLine(liste[i]);

udskriver objektet. Uden ToString metode så udskriver den bare klasse navnet.
Avatar billede arne_v Ekspert
18. oktober 2004 - 18:35 #19
Du har ikke en constrcutor uden argumenter.

public Person()
        {
        name="";
        phonenumber="";
        }
Avatar billede maxmuldjord Nybegynder
18. oktober 2004 - 18:51 #20
aha, tak Arne, det lader til at det jeg skrev i morges ikke er blevet postet ( var nok for søvnig) smid et svar så jeg ikke glemmer det. Jeg har downloadet SD da jeg ikke har råd til licens for VS på min laptop, ved du om jeg kan sætte SD til at debugge mens man taster ind ligesom VS? Jeg prøver at bøvle lidt videre men undre mig over at den siger ::::: (47): The name 'initialName' does not exist in the class or namespace 'Phonebook.Person' Det mener jeg jo at det gør jvn. ovenstående kode; min main har jeg prøvet således :
    public static void Main(string[] args)
        {
            ArrayList liste=new ArrayList();
            Console.WriteLine("Add name");
            initialName = Console.ReadLine();
            Console.WriteLine("Add phone");
            initialPhoneNumber = Console.ReadLine();
            liste.Add(initialName,initialPhoneNumber);
            for (int i =0; i<liste.Count;i++)
                Console.WriteLine(liste[i]);
            Console.ReadLine();
        }
    }
}
Avatar billede arne_v Ekspert
18. oktober 2004 - 19:02 #21
Nix. De er bare argumenter til en funktion.
Avatar billede arne_v Ekspert
18. oktober 2004 - 19:02 #22
public static void Main(string[] args)
        {
            ArrayList liste=new ArrayList();
            Console.WriteLine("Add name");
            String initialName = Console.ReadLine();
            Console.WriteLine("Add phone");
            String initialPhoneNumber = Console.ReadLine();
            liste.Add(initialName,initialPhoneNumber);
            for (int i =0; i<liste.Count;i++)
                Console.WriteLine(liste[i]);
            Console.ReadLine();
        }
    }
}
Avatar billede arne_v Ekspert
18. oktober 2004 - 19:03 #23
Jeg bruger selv SharpDevelop
Avatar billede arne_v Ekspert
18. oktober 2004 - 19:03 #24
svar
Avatar billede maxmuldjord Nybegynder
18. oktober 2004 - 19:12 #25
ahhhhhhhhhhr... for .... Ja jeg lærer noget hvergang, problemet er bare at huske det. Jeg ved godt at du bruger SD, det var det der gav mig ideen, det er en lille smule anderledes end VS men prisen er jo i orden 8>)
Avatar billede maxmuldjord Nybegynder
18. oktober 2004 - 19:31 #26
hehe .. nu brokker den sig igen, den vil have overload for denne:  liste.Add(initialName,initialPhoneNumber); takes 2 arguments??
Avatar billede arne_v Ekspert
18. oktober 2004 - 19:34 #27
liste.Add(initialName,initialPhoneNumber);

skal vel være

liste.Add(new Person(initialName,initialPhoneNumber));
Avatar billede maxmuldjord Nybegynder
18. oktober 2004 - 19:40 #28
jamen det skal det Arne! Tusind tak nu må jeg se om jeg selv kan komme videre
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