problemet er at metoden skal kigge alle kunder igennem og sammenligne den indtastede streng med alle kundens attributter... kan være omfattende når der kan være 2-3000 kunder der skal gennemsøges...
jeg har lavet min database i sql og bruger interbase... men har ikke den fjerneste ide til hvordan jeg løser problemet.. indtil nu har du kommet med flere forslag som jeg ikke umiddelbart aner hvordan jeg skal anvende.. har jeg beskrevet min forespørgsel forkert... eller stiller jeg for store krav.. der er måske ikke enkelte løsninger?
både ja og nej.. strengen kunne være "Søren Jensen" og min søgestreng er Søren.. eller Jens.. begge vil finde ham i kartoteket.. og ja et par tusinde kunde skal det nok blive til
mallemab>> disky snakkede også om datbasen og bruge den... om det er det hurtigste ved flere søgning / sikkrerer ved jeg ikke... men % tegnet vil Interbase sq ikke æde.. hvis man forestiller sig at der skal være flere søgninger inden man får de rigtige data fra kunden (kunder kan være glemsomme) vil det så ikke være hurtigst hvis det hele ligger i en vector (Ram) contra databasen (Harddisk)... eller har jeg misforstået noget...
For det første kender jeg ikke Interbase, og må derfor gå udfra at syntaksen er anderledes m.h.t. LIKE end på f.eks. MYSQL, det spørgsmål hører vel hjemme et andet sted. For det andet hvis du kun har tingene til at ligge i ram hvad så når din maskine crasher ? Du bliver nødt til at have persistens på dine data, og det nemmeste er vel at benytte en database eller hva ? Du skriver også at du skal lave flere søgninger på samme kunde, hvad mener du præcist ? er det kunden der ringer ind flere dage i træk for at ændre/tilføje noget til sin profil ? For hvis det er tilfældet hvad så med at give ham et kundenummer(f.eks. en long) som han så skal oplyse, så får du ihvertfald et hurtigt opslag i databasen.
select * from kundetabel where kundenr = 101;
hvis han så ikke lige kan huske sit kundenr. så må du jo bruge fritekst søgningen på f.eks. navne feltet.
mallemab> jeg har oprettet en database med kunderne og pt bliver hele databasen hentet ind i en vector og gennemløbet ved at taste 'idnummer' ganske som du foreslog... men... sjældent kan de huske det og jeg skal til at søge på andre af attributterne... jeg tænkte på en fælles søgestreng... ligesom hos google eller andre søge maskiner.. et søgefelt der sammenligner den indtastede streng med alle attributerne og findes strengen i en af attrributerne eller strengen udgør et fragment af en af attributterne, ja så hentes kunden ind.. eks... søgestreng= 'Søren' Resultat kunne være navn = Sørensen, eller adresse = Rasmus Søren P´svej 4 Håber jeg har forklaret mig forståeligt.... kort et søgefelt der løber alle attributterne igennem og ikke som idag et søgefelt til hver attribut der kan søges på...
Enten skal du smide databasen ud og bruge f.eks. Mysql.
Eller du må gøre som jeg tidligere foreslog.
Nemlig at konsekvent gå samtlige dine records igennem for at finde om et ord forekommer i et eller flere felter.
Det du også kan gøre er at lave en sorteret liste af de enkelt felter. I denne liste gemmer du indholdet af et felt sammen med record nummeret fra din Vector.
Når du sø skal se om 'søren' forekommer i et eller flere felter, må du slavisk lave en 'indexOf()' på samtlige felter i denne liste.
Men hvorfor hente alle tupler i databasen ind i ram, du kan jo bare finde dem du skal bruge når der er brug for dem. eks:
1. En kunde ringer og du søger ved hjælp af sql i databasen på hans fornavn.
2. Du får et resultset retur med flere kunder med samme navn, dem kan du så lave til kunde-objekter og liste med de attributter du finder nødvendige, og derfra udvælge netop den kunde der er den rigtige.
3. Når kunden er udvalgt har du fat i netop den kunde du skal arbejde med, efter at du har ændret på kunde-objektet laver du så en update i databasen.
Nu ved jeg ikke helt hvad det er du er ude efter man hvis du vil holde dig til det du har beskrevet i den første post skal det vel bare gøre som følger: Vector kunder;
public Vector findKunde(String streng) { Vector nyVector = new Vector(); for (int i; i<kunder.size();i++) { Kunde k = (Kunde)kunder.elementAt(i); String navn = k.getNavn(); String adresse = k.getAdresse();
mallemab: Det med databasen har han jo sagt at interbase ikke kan finde ud af.
Forresten kan din kode optimeres temmeligt meget, du allokerer ALT for mange objekter med din løsning.
Denne her er langt bedre, hurtigere og mindre resource krævende:
public Vector findKunde(String streng) { Vector nyVector = new Vector(); Kunde k; String nav; String adresse; int size=kunder.size(); for (int i; size;i++) { k = (Kunde)kunder.elementAt(i); navn = k.getNavn(); adresse = k.getAdresse();
Når en variable KUN bliver brugt i en løkke er det MEGET dumt at erklærer den inden i løkken, da du for hvert gennemløb skal allokere plads til en ny.
Ligeledes er din brug af kunde.size() i for løkkens afslutnings paramater en dum ting, da der så skal foretages et metode kald for hvert eneste gennemløb, derfor henter man size() udenfor for løkken.
Et helt andet problem er at .indexOf() ser forskel på store og små bogstaver, derfor skal man først konvertere input strengene til f.eks. uppercase inden man kører dem igennem .indexOf() Altså:
public Vector findKunde(String streng) { streng=streng.toUpperCase(); Vector nyVector = new Vector(); Kunde k; String nav; String adresse; int size=kunder.size(); for (int i; size;i++) { k = (Kunde)kunder.elementAt(i); navn = k.getNavn().toUpperCase(); adresse = k.getAdresse().toUpperCase();
fandt en anden løsning... samlede alle attributterne der skulle sweepes i en string og brugte herefter regionMatches() til at finde mine objecter med indhold af søgestrengen.... men takker for hjælpen...
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.