Avatar billede nicklasj Nybegynder
30. marts 2008 - 18:21 Der er 9 kommentarer og
2 løsninger

Søgning i ArrayList

Jeg har et lille problem som jeg selv har siddet og bikset rundt med i meget lang tid, uden held.

Jeg skal foretage en søgning i min arraylist hvor jeg skal kunne finde en tidligere indtastet oplysning, og på baggrund af denne, udskrive de andre oplysninger der er tilknyttet denne oplysning.

Det om handler nogle medarbejdere der har et navn et nr og andre oplysninger, ved søgning på nr. skal navnet og de andre oplysninger printes ud.

Håber på at få noget hjælp, da jeg efterhånden har brugt RIGTIG mange timer på at finde en løsning!
Avatar billede arne_v Ekspert
30. marts 2008 - 18:47 #1
Hvis din Medarbejder klasse har en passende equals metode, så bør indexOf og get
metoden i ArrayList kunnde bruges.

Skal du have et eksempel ?
Avatar billede arne_v Ekspert
30. marts 2008 - 19:11 #2
Til inspiration:

import java.util.ArrayList;
import java.util.Collections;

public class Medarbejder implements Comparable<Medarbejder> {
    private int nr;
    private String navn;
    private String stilling;
    public Medarbejder(int nr) {
        this(nr, "", "");
    }
    public Medarbejder(int nr, String navn, String stilling) {
        this.nr = nr;
        this.navn = navn;
        this.stilling = stilling;
    }
    public int getNr() {
        return nr;
    }
    public void setNr(int nr) {
        this.nr = nr;
    }
    public String getNavn() {
        return navn;
    }
    public void setNavn(String navn) {
        this.navn = navn;
    }
    public String getStilling() {
        return stilling;
    }
    public void setStilling(String stilling) {
        this.stilling = stilling;
    }
    @Override
    public String toString() {
        return "[" + nr + "," + navn + "," + stilling + "]";
    }
    @Override
    public boolean equals(Object o) {
        if(o instanceof Medarbejder) {
            Medarbejder m = (Medarbejder)o;
            return (m.nr == this.nr);
        } else {
            return false;
        }
    }
    @Override
    public int hashCode() {
        return navn.hashCode();
    }
    @Override
    public int compareTo(Medarbejder m) {
        return navn.compareTo(m.navn);
    }
    public static void main(String[] args) {
        ArrayList<Medarbejder> medarb = new ArrayList<Medarbejder>();
        medarb.add(new Medarbejder(1, "Børge Børgesen", "Direktør"));
        medarb.add(new Medarbejder(2, "Niels Nielsen", "Sælger"));
        medarb.add(new Medarbejder(3, "Karl Karlsen", "Lagermedarebjder"));
        for(Medarbejder m : medarb) {
            System.out.println(m);
        }
        Medarbejder m2 = medarb.get(medarb.indexOf(new Medarbejder(2)));
        System.out.println(m2);
        Collections.sort(medarb);
        for(Medarbejder m : medarb) {
            System.out.println(m);
        }
    }
}
Avatar billede nicklasj Nybegynder
30. marts 2008 - 20:26 #3
Mange tak for det hurtige svar, jeg vil kigge nærmere på eksemplet og vender tilbage efter det!
Avatar billede nicklasj Nybegynder
30. marts 2008 - 20:38 #4
Okay, nu har jeg set lidt nærmere på det. Jeg må indrømme, at jeg faldt lidt af da jeg så @Override og hashCode - det er jeg ikke kommet til endnu - har kun læst til datamatiker i 2 mdr.

Så enten, hvis du vil uddybe lidt, eller også så må jeg bare prøve at læse lidt frem i bogen ;)
Avatar billede arne_v Ekspert
30. marts 2008 - 20:43 #5
@Override kan du ignorere - det informerer bare compileren om at det her en metode
som Medarbejder klassen overrider den metode der finde i Object klassen (som Medarbejder
arver fra).

toString gør at man kan udskrive instanser af Medarbejder.

equals gør at ArrayList .indexOf metoden kan finde en instans.

hashCode skal man bare have når man har en equals.

compareTo gør at Collections .sort kan sortere rigtigt.
Avatar billede nicklasj Nybegynder
30. marts 2008 - 20:57 #6
Okay, mange tak, jeg vil forsøge mig frem - det er bare et lidt større system bygget op over 7 klasser, så skal lige eksperimentere lidt. Vender tilbage når jeg har fået afprøvet det, tak!
Avatar billede usse Nybegynder
31. marts 2008 - 13:47 #7
synes måske det er lidt overkill at indblande comparable hashcode når du ikke er nået til det stadie endnu hvor man ikke fokuserer på hvordan tingene gøres mest rigtigt..

her er et lille eks.. ved ikke om det er noget i den stil? ikke en særlig effektiv måde at gøre det på, men hvad du har lært indtil videre går jeg udfra at det skal gøres sådan?

import java.util.*;

public class EmpList
{
    private List<Emp> empList;
   
    public EmpList()
    {
        empList = new ArrayList<Emp>();
    }
   
    public void addEmp(String f, String l, int p)
    {
        empList.add(new Emp(f,l,p));
    }
   
    public boolean searchNr(int p)
    {
        for( Emp e : empList)
        {
            if(e.phonenr==p)
                return true;
        }
        return false;
    }
   
    public boolean searchFirstName(String n)
    {
        for( Emp e : empList)
        {
            if(e.fname.equalsIgnoreCase(n))
                return true;
        }
        return false;
    }
   
    public void printEmpList()
    {
        for(Emp e : empList)
        {
            System.out.println(e);
        }
    }
   
    // inner class
    class Emp
    {
        public String fname;
        public String lname;
        public int phonenr;
       
        public Emp(String f, String l, int p)
        {
            fname = f;
            lname = l;
            phonenr = p;
        }
       
        public String toString()
        {
            return "Name: "+fname+" "+lname+" Phone: "+phonenr;
        }
    }
   
    public static void main(String args[])
    {
        EmpList el = new EmpList();
        el.addEmp("Bjarke1", "Lala", 74456283);
        el.addEmp("Ulla", "Lala", 232323);
        el.addEmp("Niles", "Lala", 56565656);
       
        el.printEmpList();
       
        System.out.println("Found name?"+el.searchFirstName("Uella"));
        System.out.println("Found phone ?"+el.searchNr(5665656));
    }
   
}
Avatar billede arne_v Ekspert
31. marts 2008 - 15:44 #8
Det kan man naturligvis godt argumentere for.

Mit argument er at man bør bruge de indbyggede indexOf og contains metoder i ArrayList<>
og at man så må bide i det sure æble og lære om equals (og hashCode) med det samme.

Men jeg er formentlig ikke den bedst kvalificerede til at vurdere hvad der er den
bedste rækkefølge at lære den slags.
Avatar billede nicklasj Nybegynder
08. april 2008 - 21:09 #9
Tak til jer begge to, og jeg beklager at der er gået så længe inden mit svar, men jeg har været lidt hængt op på det seneste. Jeg fik løst mit problem med hjælp fra arne_v's eksempel, kombineret med lidt vejledning i skolen..

Er ny på siden - hvordan er det jeg deler pointne ud?

Forresten, hvis nogen skulle have interesse, så blev min løsning som følger:

  public String søgLærer(int medarbjNr)
  {
    String resultat = null;
    int tæller = 0;

    while (lærer.size() > tæller && resultat == null)
    {
      if (lærer.get(tæller).getNr() == medarbjNr)
        resultat = lærer.get(tæller).toString();
      tæller++;
    }
    return resultat;
  }
Avatar billede arne_v Ekspert
09. april 2008 - 01:11 #10
hvis vi begge lægger et svar (husk og vente på usse)

så markerer du begge navne og klikker accepter
Avatar billede usse Nybegynder
09. april 2008 - 20:46 #11
ok godt du har fundet ud af det ;)
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