Kurt Nørmark ©
Department of Computer Science, Aalborg University, Denmark
September 2001
Abstract Previous lecture Next lecture Index References Contents | Emnet for denne lektion er arrays og lister. Vi tager udgangspunkt i de vigtige og klassiske egenskaber af disse begreber. Vi giver også oversigter over, og eksempler på de specifikke klasser i Java, som understøtter disse datastrukturer. I en senere lektion vil vi se på datasamlinger (collections) i Java, som kan betragtes som en generalisering af arrays og lister. |
Arrays |
Introduktion til arrays Slide Note Contents Index References | Vi introducerer indledningsvis array begrebet. Vi lægger i nærværende fremstilling vægt på at opfatte et array som en abstrakt datatype. |
The concept array: Et array er en ordnet samling af dataelementer. Alle elementer har samme type. Elementerne tilgås via et indeks. | Indekset er et heltal, eller en værdi af en heltals-lignende type, som betegner en bestemt plads i samlingen. |
Figure. En skitse af et array. Vi tænker på et array som en tabel. Tabellen går fra (er indiceret fra) min til max. | ![]() |
Karakteristik af arrays Slide Note Contents Index References | På denne side karakteriserer vi mere omhyggeligt det klassiske arraybegreb. |
Et array er en tabel, hvor alle elementer er af samme type. Homogenitetsegenskaben af arrays er relativ til programmeringssprogets regler for typesammenlignelighed. Homogenitetsegenskaben kan også ses som en kontrast til records, hvori felterne jo kan være af forskellige typer. Konstant tidskompleksitet af hent og gem operationerne betyder at uanset hvor stor array'et er tager det samme tid at hente eller gemme et element i tabellen, uanset hvilken plads (første, sidste, midterste osv.) i arrayet vi arbejder på Hvis man ønsker det kan man tænke på 'almindelige data' som 0-dimensionelle arrays. Éndimensionelle arrays er det mest almindelige. Flerdimensionale arrays kan opfattes som éndimensionalle arrays, hvor elementtypen er en arraytype (af dimension én mindre end den oprindelige arraytype) Kravet om fast størrelse af arrays kan forstås på flere måder:
Et array kan implementeres som en konsekutiv mængde af lagerceller, hvor positionen af et element i array'et kan beregnes ud fra indekset. Det befordrer den konstante tidskompleksitet af de to fundamentale operationer: hent og gem på arrays. Med andre ord: hent og gem operationerne beregner positionen af et element i arrayet, og henter/gemmer dette element direkte, uden nogen som helst form for søgning eller gennemløb af arrayet. Det er vigtigt at slå fast, at denne garanterede effektivitet af de basale operationer på et array er et væsentlig karakteristika ved selve array ideen. |
Arrays i Java Slide Note Contents Index References | Programmeringssproget Java har et iboende array begreb. Et array er et objekt, men der er særlig, sproglig understøttelse af array objekter i Java. Dette udmønter sig bl.a. i særlige syntaktiske konstruktioner, når man programmerer med Java's iboende array begreb |
Program: Et typisk eksempel på erklæring af et array og umiddelbar array instantiering |
|
Man kunne vælge at sige at arrays er objekter. Sandheden er nok snarere, at Java designerne forsøger at få arrays til at ligne objekter. Men et array 'objekt' er ikke en instans af en Array klasse. Og sproget omgærer arrays med tilstrækkeligt meget special syntaks til at man kan se, at arrays er specielle objekter. Hvis arrays var normale objekter, altså instanser af klassen array, ville instantieringen se således ud: Array arrayNavn = new Array(MAX_LIMIT);Vi ser, at vi ikke med denne syntaks kan angive elementtypen af array'et. Dette er naturligvis et problem! Hvad vi generelt mangler er muligheden for at typeparametrisere klassen Array med en elementtype. I nogle sprog - såsom C++ kalder man dette for templates. Nogle sprog har mulighed for en sådan typeparametrisering. Java vil givetvis blive udvidet med typeparametriserede klasser på et tidspunkt. |
|
|
Eksempler på arrays i Java Slide Note Contents Index References | Vi ser her på et antal simple eksempler på anvendelse af arrays i Java |
Program: Et konkret eksempel på erklæring af et array bookShelf, som er en tabel med elementtypen Book (en klasse)
og med indekstypen 0..BOOKSHELF_LIMIT-1 |
|
Program: Et Java program som tabellægger de første 12 tal af fakultetsfunktionen.
I hovedprogrammet kan man slå op i tabellen |
|
Program: Et sammenligneligt Pascal program til tabellægning af fakultetsfunktionen. |
|
Direkte notation for array objekter i Java Slide Note Contents Index References | Når vi arbejder med arrays, hvor elementtypen er primitive typer, er det ofte en fordel at benytte sig af muligheden for at initialisere et array på en mere direkte facon end ved en række assignments. |
Anvendelsesbegrænsningen indebærer, at den direkte array notation ikke kan anvendes generelt som et udtryk, der beregnes til et array objekt. Notationen kan kun forekomme i en erklæringssammenhæng, hvor en array variabel erklæres og efterfølgende initialiseres. |
Program: Array erklæring hvor initialiseringen foregår med en direkte noteret array objekt |
|
Program: En variation af fakultetsprogrammet som benytter direkte notation for arrays. |
|
Flerdimensionelle arrays i Java Slide Note Contents Index References | På denne side vil vi kort se på arrays af mere end én dimension i Java. |
|
Program: Eksempel på 'ikke rektangulært' todimensionelt array.
Man skal lægge mærke til erklæringen af array'et triangular, hvor vi angiver
antallet af elementer i første dimension. Initialiseringen af triangular foregår
i en static block, som vi studerede i en tidligere lektion. Hvert element er af typen int[], altså
et array af heltal. Vi laver de enkelte 'rækker' i variablen row, og vi assigner
disse rækker til triangular[0] ... triangular[9].
|
|
Program: Output fra ovenstående program. |
|
Fleksible arrays i Java: Vectorer Slide Note Contents Index References | Java indeholder en klasse, som kaldes Vector. Et Vector objekt ligner et array objekt.
En Vector er dog på flere måder mere fleksibel end et Array. Vi sætter fokus forskellene
mellem Java's Array og Vector begreb på denne side. Bemærk at Vector klassen nu er forældet i Java. Man bør således ikke bruge den længere. Brug derimod en Collection klasse, f.eks. ArrayList, jf. den tilknyttede henvisning. |
Program: Et typisk eksempel på erklæring af et en vector og umiddelbar Vector instantiering.
Erklæring og instantiering af en Vector foregår præcist som for andre objekter.
Bemærk at elementtypen af en vector ikke angives eksplicit. Parameteren til konstruktoren
spiller samme rolle som MAX_LIMIT i array erklæringen. |
|
Vi karakteriserer nu Vector klassen i Java, og vi sammenligner med Java's iboende Arrays |
Klassen Object er roden i Java's klassehierarki. Object er således den mest generelle klasse i Java systemet. Alle klasser er Object klasser. Vi minder om, at tal, tegn, og booleans er værdier i Java. Når vi wrapper sådanne værdier bliver de indlejret i et objekt. Operationerne, som skubber elementer i en Vector er insertElementAt og removeElement. Vil man søge i et array må man programmere det fra situation til situation. Man skal være opmærksom på, at søgning i en stor Vector kan være ineffektiv i forhold til opslag i et Array. Array opslag er altid af konstant tidskompleksitet, mens søgning i en Vector må forventes at være af lineær tidskompleksitet (lineær søgning). Søgning efter data i en Vector foregår med bl.a. operationerne contains, indexOf og removeElement. |
|
Eksempler på brug af Vector i Java Slide Note Contents Index References | Vi ser her på eksempler, hvor Java Vectorer er brugt i stedet for arrays |
Program: Et program som demonstrerer brugen af klassen Vector i et Java program.
En mængde af strenge opbevares i leksikografisk orden i vektoren store.
Når vektoren er fyldt op forstørres den automatisk. Den starter med plads
til 5 elementer, og den forstørres med 5 elementer ad gangen, jf. konstruktoren.
I proceduren insert søger vi frem i vektoren. Når vi når indsættelsepunktet
indsættes den nye streng med 'insertElementAt'. Dette kald skubber strengene
efter indsættelsepunktet ét trin frem.
|
|
Exercise 5.1. Opgave i forlængelse af Vector eksemplet | Denne opgave tager udgangspunkt i programmet, som viser brugen af en Vector til indsættelse
af strenge i sorteret rækkefølge. Modificer programmet således at strengene i Array'et args, som altid er parameter til hovedprogrammet main, indsættes i variablen 'store' inden de af brugeren indtastede strenge bliver indsat. Se dernæst på det logiske udtryk, som styrer while løkken i proceduren insert:
Pt. er der ingen løsning til denne opgave |
|
Associative arrays |
Associative arrays Slide Note Contents Index References |
The concept associativt array: Et associativt array er et array hvor indekserne (nøglerne) ikke blot er heltal, men vilkårlige objekter, eksempelvis strenge | Et associativt array kendetegnes ved at vi kan indicere med værdier eller objekter, som er mere generelle end ordinaltyperne integer, char mv. Som navnet antyder er et associativt array velegnet til at associere to objekter, lad os sige o1 og o2, til hinanden. Givet o1 kan man via det associative array slå det associerede objekt o1 op |
Figure. En skitse af et associativt array hvor nøgleobjekterne indicerer obj objekterne | ![]() |
Nøgleobjektet skal lagres sammen med det associerede objekt for, under opslag i det associative array at kunne erkende, om man står ved det rigtige element |
|
Exercise 5.2. Opgave om associative arrays | Denne opgave har til formål at få erfaringer med associative arrays, ala Java's HashTabel.
Lav et program der på en naturlig måde associerer elementer i mængden af tekststrenge, som repræsenterer heltal,
til elementer i mængden af heltal. Eksempelvis skal strengen 'en' associeres til 1, 'to' til
2, 'enogtyve' til 21, osv. Associeringen skal foretages på baggrund af indtastninger
foretaget af brugeren af programmet. Brugeren af programmet angiver altså par af
tekstrenge og tal, som associeres. På baggrund af de registrerede associeringer
kan brugeren slå talværdien op af en given en tekstreng, som repræsenterer tallet. Programmet skal benytte et associativt array til formålet. Konkret anbefales det at benyttet en Hashtabel, java.util.HashTable i denne opgave. Pt. er der ingen løsning til denne opgave |
|
Lister |
Introduktion til lister Slide Note Contents Index References |
Figure. En liste men 6 elementer. Med denne måde at tegne listen på understreger vi at den indbyrdes rækkefølge af elementer er væsentlig. Vi giver også samtidig et hint til en typisk repræsentation af lister | ![]() |
Vi har forsøgt at fastslå de vigtige og karakteristiske operationer på lister. Indsættelse og sletning tillader os manipulere rækkefølgen af elementer. Hvis vi sammenligner med array-typen kan vi notere os, at der er fundamentale forskelle, idet rækkefølgen af array-elementer i bund og grund er fastlagt på det tidspunkt, tabellen skabes. (At vi kan simulere ændringer af rækkefølgen af array-elementer ved at skubbe og ombytte indholdet er tabellens elementer er en anden sag). Navigering til naboelementer er også fundamentalt for lister. På dette niveau af diskussionen vil vi ikke fastlægge nøjagtigt hvilken navigering der er tale om, og ej heller hvordan resultatet af navigeringen manifesterer sig. Men i alle typer af lister vil vi kunne navigere til næste element i listen. (I mange liste typer kan vi også komme afsted med at navigere til forrige element i listen). Endelig må vi have en eller anden måde at aflæse elementer fra listen. Aflæsning hænger ofte sammen med navigering, således at vi kan aflæse det element, hvortil vi har bevæget os. I forhold til arrays ser vi følgende væsentlige forskelle:
|
Enkeltkædede lister Slide Note Contents Index References | Vi studerer her den 'klassiske' enkeltsammenkædede liste. |
Figure. En enkeltsammenkædet liste. Den udefra kommende reference peger på det første element i listen. | ![]() |
The concept kæde-objekt: Kæde-objekterne er de objekter, som sammenknytter data-objekterne og evt. nabo kædeobjekter | Kæde-objekterne udgør den indre 'infrastruktur' af en kædet liste. Et kædeobjekt aggregerer to informationer: referencen til et dataobjekt og en reference til det efterfølgende kædeobjekt. Klienterne af en kædet liste bør ikke have kendskab eller adgang til kæde-objekterne | |
The concept data-objekt: Data-objekterne er de objekter, som er indsat i listen | Data-objekterne er de objekter, som programmøren håndterer, og som indsættes i listen | |
The concept hægte: Hægterne er pointere som udgår fra kæde-objekterne | Hægterne er referencer mellem objekterne indbyrdes. Hægterne knytter kæde-objekterne sammen indbyrdes, ligesom hægterne knytter forbindelsen mellem kæde- og data-objekterne |
Program: Klassen Linkable som repræsenterer kæde-objekterne.
Der er tre forskellige konstruktorer, som gør det fleksibelt at konstruere
et kæde-objekt ud fra viden om både datafeltet og next feltet, kun om data feltet,
eller ingen af delene. Ud over disse konstruktorer er der selektorer og
mutatorer af de to felter. Datarepræsentationen er privat. |
|
Indsættelse af et element i en kædet liste Slide Note Contents Index References | Vi går nu over til at studere vigtige operationer på en kædet liste. Vi starter med indsættelse i en enkeltkædet liste |
|
Image series: Skridt i indsættelse af et element i en kædet liste. | Skridt i indsættelse af et element i en kædet liste. |
Image no. 1. Et nyt element ønskes indsat på pilens plads | ![]() |
Image no. 2. Der er lavet et nyt kæde-objekt som skal kædes ind i listen efter den blå pil | ![]() |
Image no. 3. Vi fastholder en reference til elementet efter det nye element | ![]() |
Image no. 4. Der laves en reference til det nye element | ![]() |
Image no. 5. ... og videre fra det nye element til resten af listen, via det huskede element | ![]() |
|
Sletning af et element fra en kædet liste Slide Note Contents Index References |
|
Image series: Skridt i sletning af et element fra en kædet liste. | Skridt i sletning af et element fra en kædet liste. |
Image no. 1. Data-objektet som er markeret med et kryds ønskes slettet | ![]() |
Image no. 2. Kæde-objektet markeret med den blå pil skal ændres for at udføre sletningen | ![]() |
Image no. 3. Data-objektet som er markeret med et kryds er fjernet fra den kædede liste. Kæde-objektet såvel som data-objektet kan nu fjernes af garbage collectoren | ![]() |
Image no. 4. Situationen efter at kæde- og data-objekt er fjernet af garbage collectoren | ![]() |
|
Identitet af lister: Listen som objekt. Slide Note Contents Index References | Vi går nu over til at se på objekter, der repræsenterer listen som så |
Det er fristende at identificere en liste med det første element. Dermed mener vi, at når vi refererer til listen sker det via en reference til det første element i listen. Listesprog ala Lisp fungerer på denne måde. Men dette er for simpelt. Problemerne opstår hvis vi sletter det første element, eller hvis vi indsætter et nyt første element. I tilfælde af sletning kan vi let miste referencer til listen (idet alle de steder, som refererer til det første element vil komme til at referere til det slettede element). I tilfælde af indsættelse vil allerede eksisterende referencer til liste ikke inkludere det nye første element. Dette er noget rod. Problemet skyldes ene og alene, at vores listeidentitet er for svagt |
Figure. Listen repræsenteres her af ét objekt, som refererer til det første kæde-objekt. Liste objektet kan indeholder referencer til andre kæde-objekter, f.eks. det sidste (ikke vist). Endvidere kan liste objektet repræsenteres anden information om listen, f.eks. antallet af elementer i listen (antydet med 5-tallet) | ![]() |
Image series: Forskellige mulige situationer og illustrationer af liste identitet. | Forskellige mulige situationer og illustrationer af liste identitet. |
Image no. 1. En liste hvor klienter af listen blot refererer til listens første kædeobjekt. Hermed bringes kæde-objekterne til omgivelsernes kendskab, hvilket er uheldigt. Endvidere opstår der store problemer hvis det første element slettes, eller hvis der indsættes et nyt første element | ![]() |
Image no. 2. Alle referencer til listen er via liste objektet. Uanset om listen er tom, eller om listen består af et eller flere objekter, vil objektet 'enListe' repræsentere listen. Der opstår ikke problemer hvis første element slettes, eller hvis der indsættes et nyt første element | ![]() |
Image no. 3. Et alternativt billede, hvor liste objektet omslutter kædeobjekterne og dataobjekterne. Kædeobjekterne (instanserne af Linkable) er indeholdt i Listeobjektet, svarende til at Linkable klassen er en indre klasse i Liste klassen. | ![]() |
Indsættelse og sletning af første element i en liste uden identitet Slide Note Contents Index References | Her vil vi illustrere hvor galt det kan gå når man indsætter eller sletter det første element i en liste uden identitet. |
|
Image series: Problemer ved indsættelse af et nyt første element i en liste uden identitet. | Problemer ved indsættelse af et nyt første element i en liste uden identitet. Denne problemstilling er en del af motivationen for at introducere et objekt, der repræsenterer listen. |
Image no. 1. Vi forestiller os at vi via reference r1 skal indsætte det nye, røde element i listen. Læg mærke til, at vi har flere andre referencer til listen | ![]() |
Image no. 2. Vi har nu indsat det nye element i listen, og r1 refererer til det. Listen ser fin ud via r1 referencen, men via r2 og r3 kan vi ikke erkende at der er indsat et nyt element | ![]() |
Image series: Problemer ved sletning af det første element uden identitet. | Problemer ved sletning af det første element uden identitet. |
Image no. 1. Vi ønsker at slette det første element via referencen r1. | ![]() |
Image no. 2. Når vi tilgår listen via referencen r1 er det første element slettet. Men via r2 og r3 eksisterer elementet stadigvæk. (Alternativt peger r2 og r3 kun på det første element, som vi har ønsket slettet. Dette er tilfældet hvis vi har nulstillet pointeren fra e1 til e2) | ![]() |
Java programeksempler Slide Note Contents Index References | Lad os her se på et konkret eksempel på en meget simpel, men ikke desto mindre nyttig kædet liste programmeret til lejligheden i Java. Klasserne er ikke perfekte - endnu. Vi vil gradvis repararere uhesigtsmæssigheder i løbet af lektionen |
|
Program: Klassen LinkedList.
Klassen afhænger af Linkable, som vi tidligere har vist.
Datamæssigt holder vi styr på det første element og længden (private instansvariable).
Konstruktoren laver en tom liste.
Metoderne insertFirst og deleteFirst indsætter og sletter første element i listen.
Metoden firstLinkable returnerer det første kædeobjekt. Som vi vil se senere
er dette en problematisk beslutning, idet vi dybest set ikke ønsker at afsløre
detaljer om lister's interne infrastruktur (altså sammmenkædningen).
|
|
Program: Et eksempel på anvendelse af LinkedList.
Vi indsætter 1, 2 og 3. Dernæst sletter vi det første element (3).
Dernæst indsætter vi 4. Programmet udskriver 4, 2, 1.
|
|
Afsløringen af detaljer om kædeobjekterne er fremhævet i de to klasser, som er vist ovenfor |
Dobbeltkædede lister Slide Note Contents Index References | Der findes en del forskellige variationer af kædede lister. Her og på den følgende slide ser vi på to særligt interessante af disse, nemlig dobbeltkædede og cirkulærer lister |
|
Figure. I en dobbeltkædet liste er der referencer til begge naboelementer. Derved benyttes mere lager. Gevinsten er naturligvis, at man både kan navigere effektivt mod forlæns og baglæns | ![]() |
Cirkulære lister Slide Note Contents Index References |
|
Figure. I en cirkulær liste peger vores udefra kommende reference på det sidste element i listen. Idet listens sidste element peger på det første element, er det effektivt at indsætte elementer både først og sidst i listen, uanset listens længde | ![]() |
Exercise 5.3. Opgave om cirkulære lister | Formålet med denne opgave er primært at få øvelse i at arbejde med 'pointere' (referencer)
på relativt lavt niveau. En del af jer har aldrig prøvet det før. Dette er chancen...
Øvelsen er dog også en god træning i objekt-orienteret programmering. Ud fra ideerne på sliden, som er knyttet til denne opgave, ønskes en implementation af en klasse CircularList i Java. Bemærk referencen, som kommer 'udefra' går til det sidste element i den cirkulære liste. Tænk på denne reference som kommende fra objektet af typen CircularList. Følgende udgør klient-interfacet af klassen:
Indsæt et nyt første-element med indhold el i den cirkulære liste. void insertLast(Object el) void deleteFirst() void deleteLast() Object retrieveFirst() Object retrieveLast() int size() Aftest klassen CircularList. Estimer køretiden af operationerne i klassen CircularList. (Datalogerne: Brug ``Store O'' notation). Hints: Det kan være en god ide at forsyne klassen CircularList med en række interne hjælpeoperationer, såsom returnering af første elements og næstsidste elements kædeobjekt. Endvidere er en operation, som tømmer listen og en operation som laver listen 'singulær' (altså bestående af netop ét element) nyttige. |
Associationslister Slide Note Contents Index References |
På engelsk taler vi om 'association lists' |
Figure. Et samlet billede af listestrukturen af en associationsliste. Den øverste række af objekter, kædeobjekterne (farvet grå) udgør en enkeltkædet liste. Den næste række af objekter er par (farvet gule), som blot aggregerer nøgler og de associerede objekter. | ![]() |
|
Gennemløb af arrays og lister |
Iteratorbegrebet Slide Note Contents Index References |
|
Program: Et utilfredsstillende form for gennemløb af en kædet liste.
Programmet indsætter først nogle elementer i en liste. Til illustration, slettes også et
enkelt element. Dernæst gennemløbes listen ved direkte brug af et Linkable objekt. Et Linkable objekt
svarer til det vi har kaldt et kæde-objekt. |
|
The concept iterator: En iterator er et objekt som har ansvar for gennemløb af en samling af data Man kan bede en iterator om det nuværende element og om repositionering i samlingen af data | En iterator er et objekt, hvortil man kan sende beskederne 'hasMoreElements' og 'nextElement'. Førstnævnte returnerer hvorvidt der er flere elementer i et gennemløb. Sidstnævnte returnerer et element. 'nextElement' må kun kaldes hvis 'hasMoreElements' returnerer true |
Program: En mere tilfredsstillende form for gennemløb af en kædet liste med en iterator.
Ligesom programmet ovenfor indsættes først indsætter nogle elementer i en liste, og der slettes et enkelt element.
Dernæst gennemløbes listen ved brug af en iterator. Man kan spørge iteratoren om der er flere elementer i listen,
og om det næste element. |
|
Program: Klassen LinkedList som anvendes i ovenstående program.
Der er kun få variationer i forhold til den version vi studerede første i denne lektion.
Variationerne er fremhævet.
|
|
Program: Klassen LinkedListEnumeration.
Klassen implementerer et Interface som hedder Enumeration i pakken java.util.
Vi vil i en senere lektion se meget mere på Interfaces.
|
|
|
Enumerations i Java Slide Note Contents Index References | Ovenfor så vi allerede en anvendelse af en Enumeration til gennemløb af en kædet liste. Her vil vi i større detalje se på Java enumeration idéen |
Figure. Objektet enIterator har ansvar for et gennemløb af den sammenkædede liste. I Java er en iterator en instans af Enumeration i pakken java.util. Enumeration er et Interface, og ikke en klasse. Hvad det betyder ser vi i næste lektion. Objektet enIterator kan sendes beskederne 'hasMoreElements' og 'nextElement'. Objektet enIterator er skabt ved at sende enListe beskeden 'elements'. På figuren har vi allerede én gang sagt nextElement() på iteratoren | ![]() |
Det vil ofte være naturligt og nyttigt, hvis listen kan tilgå alle listens iteratorer |
Det kan ofte være nyttigt at have mere end én iterator på en liste |
Vi vil i næste lektion introducere teknikker, som tillader os at lave vore egne iteratorer. Dette kræver forståelse af Java's Interface begreb |
|
Organisering af Liste klasserne med indlejring |
|
Indlejring af Linkable i LinkedList Slide Note Contents Index References | Vi vil her illustrere anvendelsen af indre klasser til at begrænse kendskabet til kæde-objekterne i en linked list. Forsøget på denne side lykkes kun delvis. På næste side vil vi gøre det endnu bedre. |
|
Program: En skitse af indlejringen af Linkable i LinkedList.
|
|
Program: Klassen LinkedList med pakke-synlig Linkable som inner class.
Vi har valgt at give Linkable pakke synlighed. Hvis vi lader Linkable være
privat kan vi ikke oversætter liste applikationen, idet Linkable dermed ikke
kan ses uden for LinkedList.
|
|
Program: Liste applikationen repræsenteret ved klassen ListApplication.
Vi har fremhævet det sted hvor Linkable anvendes. Ideelt set ønsker vi ikke denne anvendelse.
På næste side vil vi se, hvordan vi løser problemet. |
|
På næste side vil vi gen-introducere iterator løsningen, som vi tidligere har set på. Dette giver os mulighed for at have Linkable som en private klasse. |
Indlejring af Linkable mv. i LinkedList Slide Note Contents Index References |
|
Program: En skitse af indlejringen af Linkable og LinkedListEnumeration i LinkedList.
Bemærk at Linkable er private og LinkedListEnumeration er public.
|
|
Program: Klassen LinkedList med Linkable og LinkedListEnumeration som inner classes.
Man skal specielt lægge mærke til kroppen af LinkedListEnumeration, hvor
vi kan se at der er direkte adgang til det omkringliggende objekts instansvariable (endog private instansvariable).
Vi ser også, at det omkringliggende objekt kan refereres med udtrykket LinkedList.this, som
er specialsyntaks i Java.
|
|
Program: Liste applikationen repræsenteret ved klassen ListApplication.
|
|
Chapter 5: Arrays og Lister
Course home Author home About producing this web Previous lecture (top) Next lecture (top) Previous lecture (bund) Next lecture (bund)
Generated: March 31, 2008, 12:08:29