Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 16:34 Der er 38 kommentarer og
1 løsning

søge i arraylist med seqentialsearch

ja kan man det? hvis jeg nu har:

int searchKey,
int searchResult;

searchKey = Convert.ToInt32(Console.ReadLine());
//så indtatser man telefonnummer man gerne vil finde
searchResult= SequentielSearch(searchKey, liste)

og så på den måde finde den plads på ArrayList=liste der holder mit telefonnummer og så med en if sætning spørge om man vil slette nummeret, hvis man vil det så bruge RemoveAt ? lyder det helt gak?
Avatar billede arne_v Ekspert
30. oktober 2004 - 16:36 #1
Det kan man vel godt.

Jeg ville nok bruge en Hashtable fremfor en ArrayList.
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 17:08 #2
Det havde jeg også tænkt på Arne men nu havde jeg fået min ArrayList til at virke med din hjælp. Ville du mene at det er meget bedre med en Hashtable?
Avatar billede arne_v Ekspert
30. oktober 2004 - 17:10 #3
Afhænger af listens størrelse !

lille liste -> ingen praktisk betydning
stor liste -> Hashtable meget hurtigere end sekventiel søgning i ArrayList
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 17:14 #4
ahh , det er kun til en "skole" opgave så der er ikke tale om en stor liste.
Avatar billede burningice Nybegynder
30. oktober 2004 - 17:31 #5
for (int i = 0; i < arr.Count; i++) {
  int telefonNr = (int)arr[i];

  if (telefonNr == searchKey) {
      return i //i er nummerets plads i arraylisten
  }
}

Console.WriteLine(arr[i].ToString()); //vis nr
arr.RemoveAt(i); //fjern nr.
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 17:35 #6
det ser spændende ud, kan jeg anvende det i en else if? Jeg må hellere poste lidt af min main :

public static void Main(string[] args)
        {
            int searchKey;
            int searchResult;
            ArrayList liste=new ArrayList();
            while(true)
            {
                Console.WriteLine("what would you like to do? A)dd person D)elete person T)erminate");   

                string answer = Console.ReadLine().ToUpper();
                if(answer == "A")
                {
                    AddToList(liste);
                }
                else if(answer == "D")
                   
                {
                    searchKey=Convert.ToInt32(Console.ReadLine());
                   
                   
                }
                else if(answer == "T")
                {
                    break;
                }
            }            for (int i =0; i<liste.Count;i++)
                            Console.WriteLine(liste[i]);
                            Console.ReadLine();
        }
    }
}
Avatar billede arne_v Ekspert
30. oktober 2004 - 17:37 #7
Selvfølgelig kan du anvende koden inden i en if eller en else block.
Avatar billede arne_v Ekspert
30. oktober 2004 - 17:38 #8
Men jeg forstod dig sådan at du enten havde lavet eller ville lave en SequentielSearch
metode.
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 17:45 #9
Jeg sidder som sædvanligt og roder med halve oplysninger fra vores bog, jeg har indtryk at at det er ligemeget hvordan vi kommer frem til resultatet og så var en SequentialSearch det eneste jeg kunne finde. Men jeg er sikker på at andre måder kan anvendes uden at jeg får "ballade" med min lærer.
Avatar billede arne_v Ekspert
30. oktober 2004 - 17:51 #10
Inden du bruger tid på selv at kode, så prøve lige:

searchResult = liste.IndexOf(searchKey);
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 17:57 #11
ok det prøver jeg.
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 18:32 #12
når jeg gør som nedenfor så udskriver den nummeret når man søger men ikke den plads på listen som nummeret har og det skal jeg vel bruge for at slette?

else if(answer == "D")
                   
                {
                    searchKey=Convert.ToInt32(Console.ReadLine());
                    searchResult = liste.IndexOf(searchKey);
                    Console.WriteLine("The phonenumber was found in pos:{0}\n",searchKey);
                   
                }
Avatar billede burningice Nybegynder
30. oktober 2004 - 18:38 #13
du skal heller ikke udskrive searchKey, men searchResult !!

Console.WriteLine("The phonenumber was found in pos:{0}\n",searchResult);
Avatar billede arne_v Ekspert
30. oktober 2004 - 18:40 #14
????

using System;
using System.Collections;

class MainClass
{
    public static void Main(string[] args)
    {
        ArrayList list = new ArrayList();
        list.Add("A");
        list.Add("BB");
        list.Add("CCC");
        foreach(object o in list) Console.WriteLine(o);
        int ix_bb = list.IndexOf("BB");
        Console.WriteLine(ix_bb);
        list.RemoveAt(ix_bb);
        foreach(object o in list) Console.WriteLine(o);
    }
}

giver:

A
BB
CCC
1
A
CCC
Avatar billede arne_v Ekspert
30. oktober 2004 - 18:40 #15
ja det forklarer jo
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 19:04 #16
ok, det var en fejl jeg ikke havde fået rettet men når jeg nu kun har et nummer i min liste skrive den ud på plads -1, skulle det ikke være nul?

Her er min main som den ser ud nu:

public static void Main(string[] args)
        {
            int searchKey;
            int searchResult;
            ArrayList liste=new ArrayList();
            while(true)
            {
                Console.WriteLine("what would you like to do? A)dd person D)elete person T)erminate");   

                string answer = Console.ReadLine().ToUpper();
                if(answer == "A")
                {
                    AddToList(liste);
                }
                else if(answer == "D")
                   
                {
                    searchKey=Convert.ToInt32(Console.ReadLine());
                    searchResult = liste.IndexOf(searchKey);
                    Console.WriteLine("The phonenumber was found in pos:{0}\n",searchResult);
                   
                }
                else if(answer == "T")
                {
                    break;
                }
            }            for (int i =0; i<liste.Count;i++)
                            Console.WriteLine(liste[i]);
                            Console.ReadLine();
        }
    }
}
Avatar billede arne_v Ekspert
30. oktober 2004 - 19:08 #17
Nej hvis du har 5 elementer er de nummereret fra 0 til 4.

Og da 0 bruges så er det -1 som betyder ikke fundet.
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 19:14 #18
hmmm, det er jeg ikke med på Arne, det må du undskylde men når jeg indtaster et navn og tlf. nummer og bruger f.eks 55 som telefonnummer og når jeg kommer til min søgning og så indtaster 55 så siger den at 55 var fundet på plads -1?
Avatar billede arne_v Ekspert
30. oktober 2004 - 19:16 #19
IndexOf søger på hele objekter.

D.v.s. hvis du gemmer Person objekter i listen så skal du bruge IndexOf til at
søge efter et Person objekt ikke en streng som indeholder noget information.
Avatar billede arne_v Ekspert
30. oktober 2004 - 19:19 #20
Hvis du vil det så skal du tilbage til selv at søge:

public int SearchTlf(ArrayList liste, string tlf)
{
  for(int i = 0; i < liste.Count; i++)
  {
      Person p = (Person)liste[i];
      if(p.Tlf == tlf)
      {
          return i;
      }
  }
  return -1;
}
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 19:48 #21
ville det være bedre at forsyne hver person objekt med et nummer (jeg ved ikke hvordan men det kan vel gøres)og så bruge det til at søge på og slette? Det kunne være jeg lige skulle poste hele min kode så er det måske nemmere at finde ud af?


using System;
using System.Collections;

namespace Phonebook
{
    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 override string ToString()
        {
            return (name + " " +phonenumber);
        }
    }

    class AddPerson
   
    {
        public static void AddToList(ArrayList liste)
        {
            Console.WriteLine("Add name");
            string initialName = Console.ReadLine();
            Console.WriteLine("Add phonenumber");
            string initialPhoneNumber = Console.ReadLine();
            liste.Add(new Person(initialName , initialPhoneNumber));
        }
           
       
       
        public static void Main(string[] args)
        {
            int searchKey;
            int searchResult;
            ArrayList liste=new ArrayList();
            while(true)
            {
                Console.WriteLine("what would you like to do? A)dd person D)elete person T)erminate");   

                string answer = Console.ReadLine().ToUpper();
                if(answer == "A")
                {
                    AddToList(liste);
                }
                else if(answer == "D")
                   
                {
                    searchKey=Convert.ToInt32(Console.ReadLine());
                    searchResult = liste.IndexOf(searchKey);
                    Console.WriteLine("The phonenumber was found in pos:{0}\n",searchResult);
                   
                }
                else if(answer == "T")
                {
                    break;
                }
            }            for (int i =0; i<liste.Count;i++)
                            Console.WriteLine(liste[i]);
                            Console.ReadLine();
        }
    }
}
Avatar billede arne_v Ekspert
30. oktober 2004 - 20:01 #22
Du kan sagtens bruge de eksisterende klasser.

Så kunne du tilføje en SearchPhonenumber og SearchName metode til din AddPerson
klasse.

Den var nok mere genbrugerlig hvis den i.s.f. en int returnerede et Person objekt.

Og så kan du slette med Remove i.s.f. RemoveAt.
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 20:19 #23
Du mener at jeg ikke behøver at tilføje et fortløbende nummer? Efterhånden som man tilføjer til listen? Men når du skriver "den" om at retunere et person objekt, havd mener du der?
Avatar billede arne_v Ekspert
30. oktober 2004 - 20:27 #24
Jeg skal nok lave et eksempel for at vise det.
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 20:27 #25
vent lidt, jeg laver jo et objekt at min klasse person med min liste add new Person, ikke? men hvordan får jeg fat i det igen?
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 20:39 #26
Jeg takker naturligvi for dit tilbud om et eksempel og er spændt på at se det. Men nu gætter jeg lidt - hvad hvis jeg havde en string searchKey i stedet for? er det noget i den stil du mener?
Avatar billede arne_v Ekspert
30. oktober 2004 - 21:09 #27
Jeg arbejder på et eksempel ...
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 21:10 #28
Ja det var ikke for at skynde på dig, jeg tror bare jeg "tænkte" højt 8>)
Avatar billede arne_v Ekspert
30. oktober 2004 - 21:20 #29
using System;
using System.IO;
using System.Collections;

namespace myphonebook
{
    public 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 Person() : this("", "")
        {
        }

        public override string ToString()
        {
            return (name + " " + phonenumber);
        }
    }

    public class PhoneBook
    {
        private ArrayList list;
       
        public PhoneBook()
        {
            list = new ArrayList();
        }
       
        public void Add(Person p)
        {
            list.Add(p);
        }
       
        public void Add(string name, string phonenumber)
        {
            Add(new Person(name, phonenumber));
        }
       
        public Person FindByName(string name)
        {
            for(int i = 0; i < list.Count; i++)
            {
                Person p = (Person)list[i];
                if(p.Name == name)
                {
                    return p;
                }
            }
            return null;
        }
         
        public Person FindByPhoneNumber(string phonenumber)
        {
            for(int i = 0; i < list.Count; i++)
            {
                Person p = (Person)list[i];
                if(p.PhoneNumber == phonenumber)
                {
                    return p;
                }
            }
            return null;
        }
       
        public void RemoveByName(string name)
        {
            Person p = FindByName(name);
            if(p != null)
            {
                list.Remove(p);
            }
        }

        public void RemoveByPhoneNumber(string phonenumber)
        {
            Person p = FindByPhoneNumber(phonenumber);
            if(p != null)
            {
                list.Remove(p);
            }
        }
       
        public void Print(TextWriter tw)
        {
            for(int i = 0; i < list.Count; i++)
            {
                tw.WriteLine(list[i]);
            }
        }
    }
     
    class Test
    {
        public static void Main(string[] args)
        {
            PhoneBook pb = new PhoneBook();
            while(true)
            {
                Console.Write("what would you like to do? A)dd person D)elete person P)rint list T)erminate "); 
                string answer = Console.ReadLine().ToUpper();

                if(answer == "A")
                {
                    Console.Write("Add name: ");
                    string initialName = Console.ReadLine();
                    Console.Write("Add phonenumber: ");
                    string initialPhoneNumber = Console.ReadLine();
                    pb.Add(initialName , initialPhoneNumber);
                }
                else if(answer == "D")
                {
                    Console.Write("Remove name: ");
                    string removeName = Console.ReadLine();
                    pb.RemoveByName(removeName);
                }
                else if(answer == "P")
                {
                    pb.Print(Console.Out);
                }
                else if(answer == "T")
                {
                    break;
                }
            }
        }
    }
}
Avatar billede maxmuldjord Nybegynder
30. oktober 2004 - 21:48 #30
wauw Arne, sikke et stykke arbejde, tusind tak. Jeg prøver lige at læse det igennem, vender tilbage senere eller i morgen tidlig.
Avatar billede arne_v Ekspert
31. oktober 2004 - 19:07 #31
jeg ligger et svar såfremt ...
Avatar billede maxmuldjord Nybegynder
31. oktober 2004 - 19:22 #32
Hej Arne, beklager, jeg er først kommet til computeren nu, pokker til søndag med arbejde ind imellem, jeg glæder mig til at "hygge" mig med opgaven, jeg læste lidt på det i går og jeg tror jeg har et par spørgsmål men det vender jeg lige tilbage med. Naturligvis point og endnu en gang tusind tak!
Avatar billede arne_v Ekspert
31. oktober 2004 - 19:25 #33
Tak for point.

Det var jubilæums point !

:-)

(rundede 300000 med dem)
Avatar billede maxmuldjord Nybegynder
31. oktober 2004 - 19:48 #34
Tillykke Arne !!!! Du har fortjent hvert eneste ene af dem! Jeg håber for dig at du får mange flere!  Vender tilbage senere!
Avatar billede maxmuldjord Nybegynder
03. november 2004 - 16:08 #35
Hej Arne, jeg er ved at kikke på koden, har haft alt for travlt med andre og mindre spændende ting men nu skulle jeg kunne komme igang. Men jeg syntes ikke at du har fået opdateret dine points?
Avatar billede maxmuldjord Nybegynder
03. november 2004 - 18:32 #36
Arne, kan du forklare mig hvad du gør med denne?  public Person() : this("", "")
        {
        }
Avatar billede burningice Nybegynder
03. november 2004 - 18:52 #37
den kalder konstruktoren

public Person(string initialName, string initialPhoneNumber)

med to tomme strenge. En smart måde at gøre sin kode så enkelt, gennemskuelig og vedligeholdsvenlig som mulig :)
Avatar billede arne_v Ekspert
03. november 2004 - 19:40 #38
Da C# ikke tillader default værdier, så er det måden man han hav edefault værdier
på uden at duplikere koden
Avatar billede arne_v Ekspert
03. november 2004 - 20:46 #39
Points er OK men det er "top list point" ikke "point statistik point".

Prøv og klik på mit navn.
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