Avatar billede phbecker Nybegynder
12. juni 2005 - 13:47 Der er 6 kommentarer og
1 løsning

Fjerne element fra intern datastruktur?

Jeg forsøger at lave en simpel efterligning af nogle af de grundlæggende egenskaber, Java's ArrayList og Vector har. Problemet med dem er i mit tilfælde, at man godt kan indsætte egne objekter i dem, men at man efter indsætning ikke har adgang til deres klassevariable og -metoder. Nedenstående kode virker, men jeg vil også gerne kunne fjerne et Postering-element, så man ikke behøver bekymre sig om eventuelle NullPointerExceptions - altså så man præcis får fjernet et element i det interne array i PostListe-klassen, der indeholder Postering-objekter.

Min grundlæggende ide til funktionen er som følger (har bare ikke kunnet realisere det i kode, der rent faktisk virker...):

- Flyt alle objekter EFTER det udpegede objekt (f.eks. med index-færdi sendt som argument til metoden) en plads bagud
- Lav midlertidigt array med 1 plads mindre end det nuværende array (postliste.length - 1)
- Gennemløb det oprindelige array (postliste) indtil det midlertidige array's længde er nået, og indsæt pladser fra det oprindelige array i det midlertidige (temparray)
- Sæt det oprindelige array lig det midlertidige array

Problemer, jeg ikke har taget højde for her er, hvordan man bærer sig ad med at fjerne objektet på index 0  (da den så formentlig vil komme til at lede efter en negativ index-værdi -1 => ArrayIndexOutOfBoundsException) samt det sidste objekt i array'et (hvorved den vil komme til at gå out of bounds den anden vej, altså prøve at flytte objekter efter det sidste element, som ikke findes).

Her ses min kode til klasserne Postering og PostListe:

[Postering.java]
public class Postering
{
    String navn, underpostAf;
    double beloeb;
    int maaned;
   
    public Postering(String navn, double beloeb)
    {
        this.navn = navn;
        this.beloeb = beloeb;
       
        this.maaned = 0;
        this.underpostAf = "";
    }
   
    public Postering(String navn, double beloeb, int maaned, String underpostAf)
    {
        this.navn = navn;
        this.beloeb = beloeb;
        this.maaned = maaned;
        this.underpostAf = underpostAf;
    }
   
    public void setNavn(String nytnavn)
    {
        this.navn = nytnavn;
    }
   
    public void setBeloeb(double nytbeloeb)
    {
        this.beloeb = nytbeloeb;
    }
   
    public void setMaaned(int nymaaned)
    {
        this.maaned =  nymaaned;
    }
       
    public void setUnderpostAf(String nyUnderpostAf)
    {
        this.underpostAf = nyUnderpostAf;
    }
   
    public String toString()
    {
        if(this.underpostAf == "")
            return this.navn + " \t" + this.beloeb;
        else
            return this.navn + " " + "(" + this.underpostAf + ") \t" + this.beloeb;
    }
}

[PostListe.java]
public class PostListe
{
    public Postering[] postliste;
    public int antal; // Antal posteringer lagret i denne liste
       
    public PostListe()
    {
        postliste = new Postering[1];
        antal = 0;
    }
   
    public void tilfoejPostering(Postering post)
    {
        if(antal == postliste.length)
            udvid();
       
        postliste[antal] = new Postering(post.navn, post.beloeb, post.maaned, post.underpostAf);
        antal++;
    }
   
    private void udvid()
    {
        Postering[] temp = new Postering[postliste.length + 1];
        for(int i = 0; i < postliste.length; i++)
            temp[i] = postliste[i];
           
        postliste = temp;
    }
   
    public Postering get(int index)
    {
        return postliste[index];
    }
   
    public String toString()
    {
        String str = new String();
        for(int i = 0; i < antal; i++)
            str += postliste[i].toString() + " på postliste[" + antal + "]" + "\n";
       
        return str;
    }
}
Avatar billede arne_v Ekspert
12. juni 2005 - 13:53 #1
det må bedst kunne betale sig at flytte i arrayet når du sletter fremfor at kopiere
til et nyt array

og jeg forstår ikke problemet med at fjerne det første element - det  bør kunne
håndteres normalt

til flytning kan du iøvrigt bruge System.arraycopy

du bør iøvrigt ikke udvide en af gangen men f.eks. 50 af gangen så du kun skal
udvide ved hver 50. indsæt
Avatar billede arne_v Ekspert
12. juni 2005 - 13:54 #2
(i praksis vil man lade en sådan liste klasse indeholde en ArrayList, men jeg formoder
at det er mere for at lære teknikken du vil lave din egen)
Avatar billede phbecker Nybegynder
12. juni 2005 - 14:52 #3
Ja, det er mest for at lære teknikken :) Og jeg har faktisk prøvet at indsætte Postering-objekter i en ArrayList i PostListe-klassen, men problemet er bare at jeg så ikke har adgang til de metoderog variable, der hører til et givet Postering-objekt så snart de er indsat i ArrayList'en. For eksempel (hvis postliste er en ArrayList):

postliste.get(0).setNavn("bummelum");

Går ikke an - den kender da ikke til metoden setNavn eller nogen af de andre metoder/variable tilknyttet Postering-objektet. get() returnerer bare et Object, og jeg mistænker at det er derfor... Er der en anden måde man kan gøre det på?
Avatar billede arne_v Ekspert
12. juni 2005 - 15:03 #4
((Postering)postliste.get(0)).setNavn("bummelum");
Avatar billede arne_v Ekspert
12. juni 2005 - 15:03 #5
eller i Java 1.5:

ArrayList<Postering> postliste = new ArrayLisy<Postering>;

og

postliste.get(0).setNavn("bummelum");
Avatar billede phbecker Nybegynder
12. juni 2005 - 20:12 #6
Fremragende, tusind tak for hjælpen :) Smider du lige et svar, så får du point!
Avatar billede arne_v Ekspert
12. juni 2005 - 20:13 #7
ok
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