Avatar billede simm Nybegynder
18. februar 2008 - 19:02 Der er 15 kommentarer og
2 løsninger

Binary Search

Hej

Jeg har en værdi jeg taster ind i et tekstfelt, og så bruger jeg BinarySearch til at finde index'et i et array ud fra det indtastede i tekstfeltet.

Arrayet ser sådan ud 60,80,100,120,140

Det mærkelige er, at hvis jeg taster 100, 120, 140, så finder den fint værdien, mens jeg ved alt under 100 skal påføre et ekstra 0 foran for at jeg ikke for en IndexOutOfBounds-exception

Jeg har testet af med koden der findes nedenunder
http://msdn2.microsoft.com/en-us/library/5tzt7yz3.aspx
Avatar billede arne_v Ekspert
18. februar 2008 - 19:23 #1
Må vi se lidt kode ?
Avatar billede arne_v Ekspert
18. februar 2008 - 19:42 #2
Fordi det virker jo generelt set.

Eksempel:

            int[] a = { 60, 80, 100, 120, 140 };
            int ix1 = Array.BinarySearch(a, 80);
            Console.WriteLine(a[ix1]);
            List<int> lst = new List<int>(a);
            int ix2 = lst.BinarySearch(80);
            Console.WriteLine(lst[ix2]);
Avatar billede simm Nybegynder
18. februar 2008 - 22:04 #3
Hej Arne, jeg ved ikke om jeg må poste koden her for kunden, så jeg tror jeg undlader (better safe than sorry :))

Men jeg kan godt skrive i generelle vendinger. Jeg glemte vist at skrive at det var en ArrayList værdierne lå i, og så opdagede jeg at værdierne ligger som strings, men bliver konverterede til ints senere. Gør det nogen forskel?

Jeg har prøvet at konvertere værdierne til ints og så får jeg en "Cannot compare two elements in the array"-fejl. Skyldes det at jeg skal implementere IComparer, eller er det ligegyldigt?
Avatar billede simm Nybegynder
18. februar 2008 - 22:09 #4
hmm, det skal jeg vist :) får i hvertfald fejl i selve linjen med BinarySearch-metoden
Avatar billede arne_v Ekspert
18. februar 2008 - 23:23 #5
altså "60","80","100","120","140" er jo ikke sorteret, så det gør jo en stor forskel !
Avatar billede arne_v Ekspert
18. februar 2008 - 23:24 #6
Du kan ikke bruge BinarySort på nohget som ikke er sorteret.

"060","080","100","120","140" er sorteret, men efter min mening er det ikke den
rigtige måde.
Avatar billede simm Nybegynder
19. februar 2008 - 00:35 #7
nej, og det skal helst være korrekt :)
Avatar billede arne_v Ekspert
19. februar 2008 - 01:06 #8
List<int> (eller ArrayList hvis du er stuck på 1.1) må være den rigtige måde at
gøre det på.
Avatar billede simm Nybegynder
19. februar 2008 - 03:11 #9
Det er .NET 2.0 jeg bruger, men har brugt arraylists selvom jeg godt ved det er helligbrøde.

jeg fandt flg. VB-kode som jeg har konverteret til C#, men det fungerer ikke efter hensigten.

public class CompareInts : IComparer
        {
            int System.Collections.IComparer.Compare(object x, object y)
            {
                if (x is int)
                {
                    if (y is int)
                    {
                        int value1 = (int)x;
                        int value2 = (int)y;
                        return value1.CompareTo(value2);
                    }
                    else
                    {
                        return -1;
                    }
                }
                else if (y is int)
                {
                    return 1;
                }
                else
                {
                    return x.ToString().CompareTo(y.ToString());
                }
            }
        }
Det returnerer blot ArrayListens størrelse. Hvilket må tyde på der er noget der fejler.
Avatar billede arne_v Ekspert
19. februar 2008 - 04:51 #10
Skal du ikke noget a la:

int xval;
if(x is int) xval = (int)x;
if(x is string) xval = in.Parse(x);

o.s.v. inden du sammenligner ?
Avatar billede powerpunk Nybegynder
19. februar 2008 - 09:17 #11
du kan ikke bruge 'is' til value types. skulle nok snarere være en int.TryParse()...

Iøvrigt virker det som vældig meget overkill at lave en Compare rutine til integers (og så ovenikøbet en der tager objects som argumenter. Føj!)

List<int> er absolut 'the way to go'...

Hvis du har dine talværdier liggende i sådan en skulle det være helt trivielt:

  List<int> myList = new List<int>();
  myList.Add(80);
  myList.Add(60);
  myList.Add(120);
  myList.Add(100);
  myList.Add(140);
  //etc...

  myList.Sort();
  return myList.BinarySearch(100); //returnerer 2
Avatar billede powerpunk Nybegynder
19. februar 2008 - 09:20 #12
"du kan ikke bruge 'is' til value types"
- Sludder og vrøvl... forvekslede den med 'as'...
Avatar billede powerpunk Nybegynder
19. februar 2008 - 09:24 #13
Alternativt - men også lidt grimt - kan du jo vælge at BinarySearche efter strengen "60" i stedet for integer værdien 60....
Det er vel alligvel en tekststreng du får ind fra tekstboxen...
Avatar billede simm Nybegynder
19. februar 2008 - 11:15 #14
arne: Jo det kunne godt være en idé :)

powerpunk: jeg prøver lige sidste metode, grimt men hurtigst, jeg er lidt i tidsnød *G*
Avatar billede simm Nybegynder
19. februar 2008 - 12:16 #15
Yes, det virker! Lidt en dummepeter-fejl, jeg havde glemt at tjekke inputtet fra mine tekstfelter, og konvertere til ints.. sådan går det, når man koder til langt ud på natten..

Tak for hjælpen I to, smider I lige et svar?
Avatar billede powerpunk Nybegynder
19. februar 2008 - 13:14 #16
Det var såmænd så lidt...
Avatar billede arne_v Ekspert
19. februar 2008 - 14:56 #17
svar
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



IT-JOB

Udviklings- og Forenklingsstyrelsen

Business Analyst med drive og gåpåmod

Cognizant Technology Solutions Denmark ApS

Senior Delivery Manager

Udviklings- og Forenklingsstyrelsen

IT-projektledere til forretningskritiske projekter