Avatar billede nich01 Nybegynder
05. januar 2003 - 17:27 Der er 32 kommentarer og
1 løsning

Arraylist som kartotek

Jeg har følgende kode men jeg kan ikke få det til at virke.
Hvad skal der gøres for at få det til at virke?
arne v???? eller andre
   
public class Info {
  private String navn;
  private String adresse;
  private String tlf;
  public Info(String navn, String adresse, String tlf) {
      this.navn = navn;
      this.adresse = adresse;
      this.tlf = tlf;
  }
  public String getNavn() {
      return navn;
  }
  public String getAdresse() {
      return adresse;
  }
  public String getTlf() {
      return tlf;
  }
}



ArrayList list = new ArrayList();
list.add(new Info("xxx", "yyy", "zzz"));
list.add(new Info("xxx2", "yyy2", "zzz2"));
Info inf;
for(int i = 0; i < list.size(); i++) {
  inf = (Info)list.get(i);
  System.out.println(inf.getNavn() + " " + info.getAdresse() + " " + inf.getTlf());
}
Avatar billede arne_v Ekspert
05. januar 2003 - 17:30 #1
Altså det første er en separat klasse som skal ligge i
en Info.java fil.

Det andet er et kode fragment som hører hjemme i metode
i en anden klasse.

Og det er kun et lille eksempel til at illustrere brugen af ArrayList.
Avatar billede arne_v Ekspert
05. januar 2003 - 17:33 #2
Hvis du har Info.java og en TestInfo.java med følgende
indhold:

import java.util.*;

public class TestInfo {

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(new Info("xxx", "yyy", "zzz"));
        list.add(new Info("xxx2", "yyy2", "zzz2"));
        Info inf;
        for (int i = 0; i < list.size(); i++) {
            inf = (Info) list.get(i);
            System.out.println(
                inf.getNavn() + " " + inf.getAdresse() + " " + inf.getTlf());
        }
    }
}

så skulle det compile og køre.
Avatar billede arne_v Ekspert
05. januar 2003 - 17:34 #3
Programmet er lidt trivielt men det viser, hvordan man kan bruge
en ArrayList.
Avatar billede nich01 Nybegynder
05. januar 2003 - 17:39 #4
Ja det hjalp nu kan det compileres og vise det der er i arraylisten
Avatar billede nich01 Nybegynder
05. januar 2003 - 17:40 #5
Hvordan fjerner man et objekt i arraylisten?
Avatar billede arne_v Ekspert
05. januar 2003 - 17:47 #6
list.remove(2) for at fjerne det 3. element (man nummererer fra 0 ikke fra 1 !).
Avatar billede arne_v Ekspert
05. januar 2003 - 17:48 #7
Jeg har lige broderet lidt videre.

Info.java:

package test;

public class Info {
    private String navn;
    private String adresse;
    private String tlf;
    public Info(String navn, String adresse, String tlf) {
        this.navn = navn;
        this.adresse = adresse;
        this.tlf = tlf;
    }
    public String getNavn() {
        return navn;
    }
    public String getAdresse() {
        return adresse;
    }
    public String getTlf() {
        return tlf;
    }
    public String toString() {
        return navn + ", " + adresse + ", " + tlf;
    }
}

InfoList.java:

package test;

import java.util.*;

public class InfoList extends ArrayList {
    public Info findNavn(String navn) {
        Info inf;
        for (int i = 0; i < size(); i++) {
            inf = (Info)get(i);
            if(inf.getNavn().equals(navn)) return inf;
        }
        return null;
    }
    public Info findAdresse(String adresse) {
        Info inf;
        for (int i = 0; i < size(); i++) {
            inf = (Info)get(i);
            if(inf.getAdresse().equals(adresse)) return inf;
        }
        return null;
    }
    public Info findTlf(String tlf) {
        Info inf;
        for (int i = 0; i < size(); i++) {
            inf = (Info)get(i);
            if(inf.getTlf().equals(tlf)) return inf;
        }
        return null;
    }
}

TestInfo.java:

package test;

import java.util.*;

public class TestInfo {

    public static void main(String[] args) {
        InfoList list = new InfoList();
        list.add(new Info("Hansen", "Hvænget", "11111111"));
        list.add(new Info("Jensen", "Jgade", "22222222"));
        Info inf = list.findNavn("Jensen");
        if(inf != null) {
            System.out.println(inf);
        } else {
            System.out.println("Jensen fidne ikke");
        }
    }
}

Måske kan det bruges.
Avatar billede arne_v Ekspert
05. januar 2003 - 17:49 #8
Ups. Hvis du vil bruge koden ovenfor så slet lige:
  package test;
i alle filerne.
Avatar billede arne_v Ekspert
05. januar 2003 - 17:51 #9
Bemærk at remove flytter elementerne d.v.s. at hvis du har elementer
  0=Hansen, 1=Jensen, 2=Nielsen, 3=Olsen
og kalder remove(2) så har du:
  0=Hansen, 1=Jensen, 2=Olsen
Avatar billede nich01 Nybegynder
05. januar 2003 - 18:07 #10
ja det hjalp...

Var det muligt du ville give et lille eksempel på skrivning, af Arraylistens indhold, til en tekst fil opdelt med komma?
Avatar billede arne_v Ekspert
05. januar 2003 - 18:27 #11
Ja da.

Modificeret TestInfo.java:

import java.util.*;
import java.io.*;

public class TestInfo {

    public static void main(String[] args) {
        InfoList list = new InfoList();
        list.add(new Info("Hansen", "Hvænget", "11111111"));
        list.add(new Info("Jensen", "Jgade", "22222222"));
        Info inf = list.findNavn("Jensen");
        if(inf != null) {
            System.out.println(inf);
        } else {
            System.out.println("Jensen findes ikke");
        }
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream("C:\\Kartotek.txt"));
            for(int i = 0; i < list.size(); i++) {
                inf = (Info)list.get(i);
                pw.println(inf);
            }
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
05. januar 2003 - 18:29 #12
Bemærk, at jeg benytter mig af at Info toString allerede bruger
komma.

Hvis man ikke vil benytet sig af det så kan man bruge:

import java.util.*;
import java.io.*;

public class TestInfo {

    public static void main(String[] args) {
        InfoList list = new InfoList();
        list.add(new Info("Hansen", "Hvænget", "11111111"));
        list.add(new Info("Jensen", "Jgade", "22222222"));
        Info inf = list.findNavn("Jensen");
        if(inf != null) {
            System.out.println(inf);
        } else {
            System.out.println("Jensen findes ikke");
        }
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream("C:\\Kartotek.txt"));
            for(int i = 0; i < list.size(); i++) {
                inf = (Info)list.get(i);
                pw.println(inf.getNavn() + "," + inf.getAdresse() + "," + inf.getTlf());
            }
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede nich01 Nybegynder
05. januar 2003 - 19:25 #13
Hvis man nu siger navnet både skal indeholde for of efter-navn hvordan søger man så på fx kun efternavnet
Avatar billede nich01 Nybegynder
05. januar 2003 - 20:17 #14
I infolist.java har du skrevet følgende [public class InfoList extends ArrayList {]  hvad betyder "extends Arraylist"?
Avatar billede arne_v Ekspert
05. januar 2003 - 20:25 #15
At InfoList arver fra ArrayList.

Så har InfoList alle de metoder ArrayList har plus sine
egne.

add er en metode som InfoList har arvet fra ArrayList.

findNavn er en metode specifik for InfoList.

Arv er helt centralt i Objekt Orienteret Programmering.
Avatar billede arne_v Ekspert
05. januar 2003 - 20:43 #16
Med hensyn til fornavn og efternavn, så kan jeg se 2 måder at gøre det på:

1)  Rette alle klasserne til at have fornavn og efternavn i.s.f.
    bare navn.

2)  Beholde klasserne som de er, gemme hele nvanet i navn og så
    teste på om det man søger efter er en del af navnet, således
    at "Jensen" matcher "Ole Jensen".
Avatar billede arne_v Ekspert
05. januar 2003 - 20:45 #17
Med løsning #2 kan du erstatte:

    public Info findNavn(String navn) {
        Info inf;
        for (int i = 0; i < size(); i++) {
            inf = (Info)get(i);
            if(inf.getNavn().equals(navn)) return inf;
        }
        return null;
    }

med:

    public Info findNavn(String navn) {
        Info inf;
        for (int i = 0; i < size(); i++) {
            inf = (Info)get(i);
            if(inf.getNavn().indexOf(navn) >= 0) return inf;
        }
        return null;
    }
Avatar billede nich01 Nybegynder
05. januar 2003 - 21:09 #18
Hvordan indlæser jeg tekst filen i Arraylisten når programmet starter.
Avatar billede arne_v Ekspert
05. januar 2003 - 21:27 #19
Se det er straks lidt mere vanskeligt.
Avatar billede arne_v Ekspert
05. januar 2003 - 21:36 #20
Men jeg prøver lige at kigge på det !
Avatar billede arne_v Ekspert
05. januar 2003 - 21:41 #21
import java.util.*;
import java.io.*;

public class TestInfo {

    public static void main(String[] args) {
        InfoList list = new InfoList();
        list.add(new Info("Hansen", "Hvænget", "11111111"));
        list.add(new Info("Jensen", "Jgade", "22222222"));
        Info inf = list.findNavn("Jensen");
        if(inf != null) {
            System.out.println(inf);
        } else {
            System.out.println("Jensen findes ikke");
        }
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream("C:\\Kartotek.txt"));
            for(int i = 0; i < list.size(); i++) {
                inf = (Info)list.get(i);
                pw.println(inf);
            }
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            BufferedReader br = new BufferedReader(new FileReader("C:\\Kartotek.txt"));
            String line = null;
            while((line = br.readLine()) != null) {
                StringTokenizer st = new StringTokenizer(line, ",");
                String navn = st.nextToken().trim();
                String adresse = st.nextToken().trim();
                String tlf = st.nextToken().trim();
                Info inf2 = new Info(navn, adresse, tlf);
                System.out.println(inf2);
            }
            br.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede nich01 Nybegynder
05. januar 2003 - 23:34 #22
Det virker super.
Men jeg har lidt problemer med at få den til at søge efter flere med samme navn den skulle gerne skrive alle navnene ud, men den tager kun den første.
Avatar billede arne_v Ekspert
06. januar 2003 - 07:32 #23
Den findNavn finder kun den første som matcher !

Hvis du skal have flere så skal du bruge noget i retning af:

    public InfoList findNavn(String navn) {
        InfoList res = new InfoList();
        Info inf;
        for (int i = 0; i < size(); i++) {
            inf = (Info)get(i);
            if(inf.getNavn().equals(navn)) res.add(inf);
        }
        return res;
    }
Avatar billede nich01 Nybegynder
06. januar 2003 - 15:42 #24
Jeg har lidt problemer med at få den til at arbejde sammen med min søger i AddressRun:
   

Info inf = list.findNavn("sen");

    if(res != null) {
        System.out.println(res);
    } else {
        System.out.println("Jensen findes ikke");
        }

Hvad skal jeg ændre for at få den til at skrive "res" ud?
Fejl meldelse: "variable res might not have been initialized"
Avatar billede arne_v Ekspert
06. januar 2003 - 15:54 #25
Jeg formoder vi snakker om at finde flere navne som indeholder en del-streng.

Prøv med:

    public InfoList findNavn(String navn) {
        InfoList res = new InfoList();
        Info inf;
        for (int i = 0; i < size(); i++) {
            inf = (Info)get(i);
            if(inf.getNavn().indexOf(navn) >= 0) res.add(inf);
        }
        return res;
    }

og:

Info[] allinf = list.findNavn("sen");
for(int i = 0; i < allinf.length; i++) {
  Ssystem.out.println(allinf[i]);
}
Avatar billede nich01 Nybegynder
09. januar 2003 - 15:21 #26
Et aller sidste spørgsmål hvad betyder: Info inf; ???
Avatar billede arne_v Ekspert
09. januar 2003 - 17:57 #27
Man erklærer en variabel med navn inf af typen Info.
Avatar billede nich01 Nybegynder
09. januar 2003 - 21:40 #28
Hej arne v
Jeg har et stort problem jeg har lavet mit program og det virker som det skal i JBuilder men hvis jeg prøver at køre det i dos promten virker det ikke hvad kan det skyldes?
Vil du eventuelt prøve at køre programmet så du kan se fejl meddelsen?
Jeg kan sende programmet til dig.
Avatar billede arne_v Ekspert
09. januar 2003 - 21:59 #29
Det kan jo skyldes flere ting.

Mest sandsyneligt classpath problemer.

Hvis du sender fejl-meddelelsen, så kan jeg måske komme med
et bud på problemet.

Du kan også emaile programmet til mig (arne_v@mail.danbbs.dk),
men jeg vil først have tid til at kigg epå det på lørdag.

[jeg er i Stockholm nu]
Avatar billede nich01 Nybegynder
09. januar 2003 - 22:00 #30
Jeg fandt fejlen selv det var package jeg ikke havde fjerne. Mange tak for hjælpen!!
Avatar billede arne_v Ekspert
09. januar 2003 - 22:31 #31
Du kan da sagtens bruge package også med java kommandoen i
DOS prompt !

Hvis du har en klasse MinKlasse i pakke minpakke, så skal
MinKlasse.java og MinKlasse.class ligge i C:\projekt\minpakke
og du skal bruge:
  javac -classpath C:\projekt ...
  java -classpath C:\projekt ...
(ikke -classpath C:\projekt\minpakke)
Avatar billede dsp82 Nybegynder
21. oktober 2003 - 19:44 #32
har nogenlunde det samme problem, har fattet koden, men hvad hentyder linjen hvor der står Info inf; til?
Avatar billede arne_v Ekspert
21. oktober 2003 - 19:50 #33
Info inf;

erklærer en variabel med navn inf af typen Info.
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