Avatar billede mosquito Nybegynder
23. april 2002 - 20:40 Der er 17 kommentarer og
2 løsninger

indtastning skal selv skelne mellem int og string???

Jeg er ved at lave en metode:

Vector kunder;
       
public Vector findKunde(String streng)
{
  Vector nyVector = new Vector();
  for (int i; i<kunder.size();i++)
  {
      if(streng del af kunder(elementAt(i))
      {                        nyVector.add(kunder.elementAt(i));
      }
  }
  return nyVector;
}

Den skal søge i en Vector med Kunder... int id, String navn, String adresse, int tlf

Hvordan laver jeg en metode der finder en kunde ud fra søgekriteriet, hvis kunden findes i Vectoren.

Søgekriterie kan være et brudstykke af en String eller en int.
Avatar billede disky Nybegynder
23. april 2002 - 20:54 #1
brug

indexOf(Object)

Den returnerer positionen i vectoren på din kunde, eller -1 hvis kunden ikke findes.

Hvis du skal kigge i diverse strings som findes i de objecter du ligger i din vector skal du hente hvert enkelt object ud og kigge.

Eller generere nogle hashmaps ud fra diverse informationer i dine kunder.
Avatar billede mosquito Nybegynder
23. april 2002 - 21:00 #2
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...
Avatar billede disky Nybegynder
23. april 2002 - 21:03 #3
helt enig.

du kan lave nogle hashmaps eller sortedset's der holder styr på positionen i din vector for dig.

Eller den klart bedste løsning, brug en database istedet.
Avatar billede mosquito Nybegynder
23. april 2002 - 21:12 #4
jeg henter ind fra en database og indsætter i vectoren... men det er her jeg får mit store spørgsmål frem..
Avatar billede disky Nybegynder
23. april 2002 - 21:23 #5
Hvis du ikke kan lade databasen gøre det for dig.

må du lave nogle TreeSet det holder styr på folks navne osv.

hvis du skulle kunne søge i del mængder af key's osv.

Så skal du skrive din egen database
Avatar billede mosquito Nybegynder
23. april 2002 - 21:28 #6
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?
Avatar billede disky Nybegynder
23. april 2002 - 21:30 #7
har jeg forstået korrekt at du har et par tusinde kunder, hvor du gerne vil have en liste over alle kunder der hedder 'Søren' f.eks ?
Avatar billede mosquito Nybegynder
23. april 2002 - 21:34 #8
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
Avatar billede mallemab Nybegynder
23. april 2002 - 23:35 #9
Hvorfor ikke bruge sql til at finde dem i databasen:

select * from kundetabel where navn like '%søren%'
Avatar billede mosquito Nybegynder
23. april 2002 - 23:44 #10
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...
Avatar billede mallemab Nybegynder
24. april 2002 - 09:43 #11
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.
Avatar billede mosquito Nybegynder
24. april 2002 - 15:35 #12
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å...
Avatar billede disky Nybegynder
24. april 2002 - 15:55 #13
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.
Avatar billede mallemab Nybegynder
24. april 2002 - 16:34 #14
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.
Avatar billede mallemab Nybegynder
24. april 2002 - 16:48 #15
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();
     
      if(navn.indexOf(streng)!=-1 || adresse.indexOf(streng)!= -1)
      {                        nyVector.add(k);
      }
  }
  return nyVector;
}

Så skulle det vel virke men det er efter min mening ikke en optimal løsning.
Avatar billede disky Nybegynder
24. april 2002 - 17:09 #16
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();
     
      if(navn.indexOf(streng)!=-1 || adresse.indexOf(streng)!= -1)
      {
                        nyVector.add(k);
      }
  }
  return nyVector;
}


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();
     
      if(navn.indexOf(streng)!=-1 || adresse.indexOf(streng)!= -1)
      {
        nyVector.add(k);
      }
  }
  return nyVector;
}


Dog er database løsningen klart bedre, hvis interbase kan udskiftes
Avatar billede mallemab Nybegynder
24. april 2002 - 17:14 #17
Helt enig Disky, det var også bare lige skrevet med venstre hånd.
Avatar billede disky Nybegynder
25. april 2002 - 10:29 #18
mallemab:

hehe :-)
Avatar billede mosquito Nybegynder
05. maj 2002 - 12:55 #19
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...
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
Kurser inden for grundlæggende programmering

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