Avatar billede snebaer Novice
27. december 2001 - 17:08 Der er 7 kommentarer og
1 løsning

Metoder med Array

Hej derude.
Det er nu første gang jeg forsøgen denne vej, men har læst mange indlæg.
Jeg er nybegynder på området men sidder med et spm.

Er der nogen der kan hjælpe mig med hvordan jeg koder en add- og en delete-metode til et Array.
Jeg har indledningen som hedder hhv.
public void addAbonnement(Abonnement a){  samt
public void deleteAb(intabId){

I den første skal a være indsat bag i abList, som er Array\'et.

I den anden skal abId være fjernet og efterfølgende elementer skal være rykket een plads ned.

Jeg håber på et svar med en god detaljeret forklaring.

VH snebaer
Avatar billede carstenknudsen Nybegynder
27. december 2001 - 17:14 #1
Har du en array som Abonnement[] eller har du en liste af en eller anden art? Hvor er abList defineret?
Avatar billede snebaer Novice
27. december 2001 - 19:44 #2
Jeg har en klasse Kunde, som skal indeholde et array af Abonnementer (da en kunde kan have flere abonnementer) samt en attribut, som angiver antal abonnementer, som kunden har.
I klassen Kunde findes:
private Abonnement[] abList=new Abonnement[maxAb];
int maxAb = 10;
Avatar billede carstenknudsen Nybegynder
27. december 2001 - 20:42 #3
Her er en løsning, men det vil være mest fordelagtigt at bruge en liste idet den er mere fleksibel mht størrelsen.
private List list = new ArrayList();
public add( A a ) { list.add( a ); }
public del(int i ) { list.remove( i ); }
Det var det, for arrays er det lidt mere omstændigt, men her er en løsning der antager at max er tilstrækkelig stor.
private int max = 10;
private A[] ab = new A[max];
private int next = 0; // er antallet af A\'er
public void add( A a ) {
ab[next++]=a;
} // add
public void del( int n ) {
for (int i=n; i<next-1; i++) // ryk alle ned
  ab[i]=ab[i+1];              // der ligger over n
next--; // reducer antallet at A\'er
} // del
Hvis du bruger listemodellen kan du altid returnere en A[] ved at skrive
A[] ab = (A[])list.toArray();
Hvis antallet af elementer ændres er det så godt som altid bedst at bruge en List, f.eks. ArrayList eller Vector hvis du arbejder med tråde.
Avatar billede snebaer Novice
01. januar 2002 - 13:03 #4
Svaret vedr. add-metoden ligner den vejledende løsning, som jeg er kommet i besiddelse af:
public void addAbonnement(Abonnement a){
//PRE  antalAb<maxAb
//POST  a er indsat bag i abList
abList[antalAb++]=a;
}

delete-metoden kan jeg ikke få til at stemme med den vejledende løsning:
public void deleteAb(int abId){
//PRE  abId findes i listen
//POST  abId er fjernet. Efterfølgende elementer er rykket een plads ned.
boolean found=false;
int i=0;
while(!found)
if(abList[i].getId()==abId)
found=true;
else i++;
for(int j=i; j<antalAb; j++)
abList[j]=abList[j+1];
antalAb--;
}

Jeg vil gerne spørge om metoderne i svaret kunne blive kommenteret uddybende, så jeg forstod dem lidt bedre samt om de ovenfor nævnte vejledende løsninger kunne blive kommenteret uddybende, så jeg også forstod dem.
I begge tilfælde gælder det både for add- og delete-metoden.

Eller tak for svaret carstenknudsen.
Avatar billede carstenknudsen Nybegynder
01. januar 2002 - 17:23 #5
Add metoden går jeg udfra er på plads.
public void addAbonnement(Abonnement a){
//PRE  antalAb<maxAb
//POST  a er indsat bag i abList
abList[antalAb++]=a;
}
Delete metoden er lidt anderledes end den jeg har foreslået men det skyldes blot at du ikke forklarede hvad dit indeks betyder; jeg kan nu se at det er en slags identification af abonnenten og ikke indeks i dit array. Der er lidt yderligere kommentarer herunder i din kildetekst.
public void deleteAb(int abId){
//PRE  abId findes i listen
//POST  abId er fjernet. Efterfølgende elementer er rykket een plads ned.
// found skal sættes true når vi har fundet det element i array\'et der har den korrekte id givet som argument: abId
boolean found=false;
// i er indeks på det næste element i array\'et vi skal undersøge for at se om det er det vi leder efter
int i=0;
// sålænge vi ikke har fundet abonnenten
while(!found)
// hvis det i\'te elemenent i array\'et har den rigtige id har vi fundet det vi søger
if(abList[i].getId()==abId)
found=true;
// ellers rykker vi indeks en frem til næste abonnent
else i++;
// når vi er nået hertil er found=true og i er indeks på det element vi skal slette
// det gør vi ved at rykke alle elementer over i (i indeks) en ned
for(int j=i; j<antalAb; j++)
abList[j]=abList[j+1];
// endelig må vi reducere antallet af elementer da vi jo har slettet det gamle i\'te element

Hvis du vil have yderligere forklaring så præciser hvad du ønsker uddybet.
antalAb--;
}
Avatar billede snebaer Novice
01. januar 2002 - 17:43 #6
Jeg forstår ikke linien abList[antalAb++]=a i add-metoden.

Desuden er jeg ikke med på abList[j]=abList[j+1] i delete-metoden.

Min manglende forståelse skyldes nok, at jeg er på begynderniveau.
Avatar billede carstenknudsen Nybegynder
01. januar 2002 - 18:25 #7
Linien abList[antalAb++]=a indsætter abonnenten a på plads nummer antalAb der er den første plads i array\'et uden en abonnent (tomt). antalAb++ betyder at antalAb tælles op med en EFTER at den er benyttet. Nu er der jo en abonnent ekstra i array\'et.

Linien abList[j]=abList[j+1] sørger for at det der før lå i j+1\'ste element i array\'et nu rykker en en til den j\'te plads. For j=4 rykkes det femte element ned og bliver det fjerde.
Avatar billede snebaer Novice
01. januar 2002 - 20:02 #8
Hej carstenknudsen.
Tak for din udholdenhed - nu dæmrede det for mig i disse opgaver.
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