04. maj 2004 - 05:22Der er
12 kommentarer og 1 løsning
Binær søgning
hejsa jeg er løbet ind i et problem med binær streng søgning, problemet ligger i jeg løber ind i et uendelig loop så snart den første forekomst af strengen er fundet, dette kunne løses ved at ændre min løkke betingelse og tilføje en boolean , dette ville blot udelukke muligheden for at finde samtlige objecter i vectoren som indeholder netop den streng jeg leder efter håber nogen kan give lidt input
og lidt kode:
public static Vector findProdukt(Vector produkter, String søgenavn) { Vector p = new Vector(); int left = 0; int right = produkter.size() -1; int mid; while(left <= right) { mid = (left + right) / 2; String s = ((Produkt) produkter.get(mid)).getNavn(); if(søgenavn.compareTo(s) > 0) { left = mid +1; } else if(søgenavn.compareTo(s) < 0) { right = mid -1; } else if(søgenavn.equals(s)) { p.add(produkter.get(mid)); } } return p; }
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
burde måske lige tilføje at jeg udemærket er klar over jeg skal ændre på mit søge interval når jeg finder strengen, jeg kan bare ikke lige gennemskue hvad jeg skal ændre den til
Jeg ville nok lade den første while løkke kun finde et mid der matcher og så lave to nye while løkker: - en der går baglæns og finder den første som matcher - en anden som går forlæns og tilføjer til Vector så længde de matcher
jeg har nørklet lidt med det, og kom frem til følgende, problemet er blot den berømte "Off By One", jeg ved med sikkerhed strengen findes 3 gange i min vector, men allligevel indeholder min nye vector kun 2 objecter, nogen hints ? :-)
og lidt kode:
public static Vector findProdukt(Vector produkter, String søgenavn) { Vector p = new Vector(); boolean found = false; String s = null; int left = 0; int right = produkter.size() - 1; int mid = 0; while (!found && (left <= right)) { mid = (left + right) / 2; s = ((Produkt) produkter.get(mid)).getNavn(); if (søgenavn.compareTo(s) > 0) { left = mid + 1; } else if (søgenavn.compareTo(s) < 0) { right = mid - 1; } else if (søgenavn.equals(s)) { System.out.println("fundet"); p.add(produkter.get(mid)); found = true; } } left = mid - 1; right = mid + 1; while (søgenavn.equals(((Produkt) produkter.get(left)).getNavn()) && (left >= 0)) { p.add(produkter.get(left)); left--; } while (søgenavn.equals(((Produkt) produkter.get(right)).getNavn()) && (right < produkter.size() - 1)) { p.add(produkter.get(right)); right++; } return p; }
ahh nej, og det hjalp en hel del, jeg takker ærbødigt, kan entlig godt se logikken i at tjekke om indexet er løbet udover den tilladte størrelse før man forsøger at kalde et element, smider du lige et svar ? :)
ikke lige det man lærer når man har om logiske kvantore på uni. owell så lærte jeg også noget i dag :-)
Synes godt om
Ny brugerNybegynder
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.