|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
22.7.1. System.Collections.ArrayListIn onderstaand voorbeeld zie je hoe een aantal members van het ArrayList type worden gebruikt : Visual Basic 2010 Broncode Class Example3 Public Shared Sub Main() Dim arrayList1 As New System.Collections. ArrayList Console.WriteLine(arrayList1.Capacity) Console.WriteLine(arrayList1.Count) arrayList1 = New System.Collections. ArrayList(2) Console.WriteLine(arrayList1.Capacity) arrayList1.Add(1) arrayList1.Add( "2"c) Console.WriteLine(arrayList1.Capacity) arrayList1.Add( "three") Console.WriteLine(arrayList1.Count) Console.WriteLine(arrayList1.Capacity) arrayList1.AddRange( New Integer() {4, 5, 6}) PrintArrayList(arrayList1) arrayList1.Remove( "2"c) PrintArrayList(arrayList1) arrayList1.RemoveAt(3) PrintArrayList(arrayList1) arrayList1.RemoveRange(1, 3) PrintArrayList(arrayList1) Console.WriteLine(arrayList1.Count) Console.WriteLine(arrayList1.Capacity) arrayList1.TrimToSize() Console.WriteLine(arrayList1.Count) Console.WriteLine(arrayList1.Capacity) arrayList1.AddRange( New Integer() {2, 1, 3}) Dim searchValue As Object = 1 Console.WriteLine(arrayList1.Contains(searchValue)) Console.WriteLine(arrayList1.IndexOf(searchValue)) Console.WriteLine(arrayList1.LastIndexOf(searchValue)) arrayList1.Reverse() PrintArrayList(arrayList1) arrayList1.Sort() PrintArrayList(arrayList1) arrayList1.Clear() Console.WriteLine(arrayList1.Capacity) Console.WriteLine(arrayList1.Count) Console.ReadLine() End Sub Public Shared Sub PrintArrayList( ByVal arrayList As Collections. ArrayList) For index As Integer = 0 To arrayList.Count - 1 If arrayList.Item(index) IsNot Nothing Then Console.Write(arrayList.Item(index).ToString() & " - ") End If Next Console.WriteLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 0
0
2
2
3
4
1 - 2 - three - 4 - 5 - 6 -
1 - three - 4 - 5 - 6 -
1 - three - 4 - 6 -
1 -
1
8
1
1
True
0
2
3 - 1 - 2 - 1 -
1 - 1 - 2 - 3 -
4
0 (1) : New System.Collections.ArrayList kan vereenvoudigd worden naar New ArrayList indien een Imports is opgenomen naar de System.Collections namespace ( door dus bijvoorbeeld de regel Imports System.Collections bovenaan het document te plaatsen ).
(2) : De capaciteit van de ArrayList ( opvraagbaar en instelbaar ), by default is de capaciteit nul, bij het toevoegen van een eerste element wordt de capaciteit vier, bij het toevoegen van het vijfde element wordt de capaciteit verdubbeld ( naar acht ), bij het toevoegen van het negende element wordt de capaciteit opnieuw verdubbeld ( naar zestien ), enzovoort ... .
(3) : Het aantal elementen ( enkel opvraagbaar ), na initialisatie van de ArrayList is dit nul.
(4) : Een andere dan de default capaciteit kan worden meegegeven aan de constructor.
(5) : De Add(value As Object) method verwacht een Object expressie die de waarde voorstelt die moet worden toegevoegd. Bijgevolg is dit collectietype breed inzetbaar, gezien elementen van alle datatypes hieraan kunnen worden toegevoegd.
(6) : Aan de AddRange() method kan bijvoorbeeld een array worden doorgegeven van welke alle elementen een voor een zullen worden toegevoegd aan de ArrayList instantie.
(7) : Het eerste karakter "2"c zal worden verwijderd.
(8) : Element op index 3 wordt verwijderd.
(9) : Drie elementen startend op index 1 zullen worden verwijderd.
(10) : Zet de capaciteit gelijk aan het aantal elementen.
(11) : De Sort() method zal proberen de elementen met elkaar te vergelijken om ze in een logische volgorde te kunnen (ver)plaatsen. Niet altijd zal deze vergelijking van de elementen slagen, Person objecten en Integer waarden zijn bijvoorbeeld moeilijk onderling vergelijkbaar, exceptions kunnen dus voorkomen.
(12) : Verwijderd alle elementen, de capaciteit blijft behouden.
(13) : Ook de elementen van een ArrayList zijn met een For Each iteratie te benaderen.
(14) : Een default indexer Item is beschikbaar om de elementen op een bepaalde indexpositie op te vragen of in te stellen, de Item(index As Integer) property levert een Object expressie op. Bijgevolg is het mogelijk dat de client van de ArrayList instantie de Item expressie zal moeten casten om aan de members te kunnen uit de interface van eigenlijke element type.
Als men om een collectie te beheren een Array gaat gebruiken, moet men :
- manueel de array uitbreiden voor het toevoegen van elementen, bijvoorbeeld aan de hand van een ReDim statement - manueel de array doorlopen voor het opzoeken van een waarde - ...
Of kort gesteld dient men allerhande implementaties te schrijven voor het toevoegen, opzoeken of verwijderen van een element, voor het sorteren of legen van de elementen, ... Indien men hiervoor een ArrayList gaat gebruiken zijn de meeste van deze implementaties reeds voorzien, en spaart men bijgevolg een pak werk uit. boven
22.7.2. OefeningOpgave :
Maak zelf een eenvoudige versie van een ArrayList klasse.
Gebruik een gewone array als interne datastructuur.
Zorg ervoor dat onderstaande clientcode bijhorende output geeft. Visual Basic 2010 Broncode Class Exercise2Task Public Shared Sub Main() Dim arrayList1 As ArrayList = New ArrayList Console.WriteLine(arrayList1.Capacity) Console.WriteLine(arrayList1.Count) arrayList1 = New ArrayList(2) Console.WriteLine(arrayList1.Capacity) arrayList1.Add(1) arrayList1.Add( "2"c) Console.WriteLine(arrayList1.Capacity) arrayList1.Add( "three") Console.WriteLine(arrayList1.Count) Console.WriteLine(arrayList1.Capacity) PrintArrayList(arrayList1) arrayList1.RemoveAt(1) PrintArrayList(arrayList1) Console.WriteLine(arrayList1.Count) Console.WriteLine(arrayList1.Capacity) arrayList1.TrimToSize() Console.WriteLine(arrayList1.Count) Console.WriteLine(arrayList1.Capacity) PrintArrayList(arrayList1) arrayList1.Clear() Console.WriteLine(arrayList1.Capacity) Console.WriteLine(arrayList1.Count) PrintArrayList(arrayList1) Console.ReadLine() End Sub Public Shared Sub PrintArrayList( ByVal arrayList As ArrayList) For index As Integer = 0 To arrayList.Count - 1 If arrayList.Item(index) IsNot Nothing Then Console.Write(arrayList.Item(index).ToString() & " - ") End If Next Console.WriteLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 16
0
2
2
3
4
1 - 2 - three -
1 - three -
2
4
2
2
1 - three -
2
0 Oplossing : Visual Basic 2010 Broncode Class ArrayList Private m_Capacity As Integer Private m_Items As Object() Private m_ItemCount As Integer Public Sub New( Optional ByVal capacity As Integer = 16) m_Capacity = capacity Clear() End Sub Public ReadOnly Property Capacity() As Integer Get Capacity = m_Capacity End Get End Property Public ReadOnly Property Count() As Integer Get Count = m_ItemCount End Get End Property Public Sub Add( ByVal value As Object) If Count >= Capacity Then m_Capacity = Capacity * 2 ReDim Preserve m_Items(Capacity - 1) End If m_Items(Count) = value m_ItemCount += 1 End Sub Default Public ReadOnly Property Item( ByVal index As Integer) As Object Get Item = m_Items(index) End Get End Property Public Sub RemoveAt( ByVal index As Integer) For shiftIndex As Integer = index To Count - 1 m_Items(index) = m_Items(index + 1) Next m_Items(Count - 1) = Nothing m_ItemCount -= 1 End Sub Public Sub TrimToSize() m_Capacity = Count ReDim Preserve m_Items(Capacity - 1) End Sub Public Sub Clear() ReDim m_Items(Capacity) m_ItemCount = 0 End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
boven
22.7.3. Typesafe System.Collections.Generic.List(Of T)Indien het type van de elementen van de ArrayList vastligt, kan men beter een typesafe variant van ArrayList gebruiken, namelijk List(Of T).
Voor meer details over dergelijke generieke collectietypes en typesafe collecties, zie de desbetreffende topics.
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|