source: trunk/ab5.0/ablib/src/Classes/System/Collections/Generic/Dictionary.ab@ 542

Last change on this file since 542 was 542, checked in by イグトランス (egtra), 16 years ago

Controlをデリゲートベースにした。DictionaryのContainsKeyとTryGetValueを実装。デリゲートの追加・削除の右辺にNothingを指定可能にした。

File size: 5.3 KB
RevLine 
[310]1'Classes/System/Collections/Generic/Dictionary.ab
2
3'#require <Classes/System/Collections/Generic/EqualityComparer.ab>
4
5Namespace System
6Namespace Collections
7Namespace Generic
8
9Namespace Detail
[313]10 Class Pair
[310]11 Public
[313]12 Sub Pair(key As Object, value As Object)
[310]13 Key = key
14 Value = value
15 End Sub
16
[313]17 Key As Object
18 Value As Object
[310]19 End Class
20End Namespace 'Detail
21
22Class Dictionary<Key, T>
23Public
24 'Constructor
25 Sub Dictionary()
26 initialize(23)
27 End Sub
28' Sub Dictionary(d As IDictionary<Key, T>)
29' Sub Dictionary(comparer As IEqualityComparer<Key>)
30 Sub Dictionary(capacity As Long)
31 initialize(capacity)
32 End Sub
33' Sub Dictionary(d As IDictionary<Key, T>, comparer As IEqualityComparer<Key>)
34' Sub Dictionary(capacity As Long, comparer As IEqualityComparer<Key>)
35
36 'Properties
37' Function Comparer() As IEqualityComparer<Key>
38' Virtual Function Count() As Long
39' End Function
40
[312]41 Virtual Function Item(key As Key) As T
[537]42 If ActiveBasic.IsNothing(key) Then
[410]43 Throw New ArgumentNullException("key")
[310]44 End If
45
[393]46 Dim hash = getHash(key)
[310]47 Dim a = al[hash] As ArrayList
48
[542]49 If Not ActiveBasic.IsNothing(a) Then
[310]50 Dim i As Long
51 For i = 0 To ELM(a.Count)
[393]52 Dim pair = a[i] As Detail.Pair
[310]53 If pair.Key.Equals(key) Then
54 Return pair.Value
55 End If
56 Next
57 End If
[403]58
59 Throw New KeyNotFoundException
[310]60 End Function
61
62 Virtual Sub Item(key As Key, value As T)
[537]63 If ActiveBasic.IsNothing(key) Then
64 Throw New ArgumentNullException("key")
[310]65 End If
66
[393]67 Dim hash = getHash(key)
[310]68 Dim a = al[hash] As ArrayList
69
70 If Object.ReferenceEquals(a, Nothing) Then
71 a = New ArrayList
72 al[hash] = a
73 Else
74 Dim i As Long
75 For i = 0 To ELM(a.Count)
[393]76 Dim pair = a[i] As Detail.Pair
[310]77 If pair.Key.Equals(key) Then
78 pair.Value = value
[542]79 Exit Sub
[310]80 End If
81 Next
82 End If
83
[393]84 a.Add(New Detail.Pair(key, value))
[310]85 End Sub
86
87' Function Keys() As KeyCollection
88' Function Values() As ValuesCollection
89/*
90 'Operators
[313]91' Function Operator [](key As Key) As T
92 Function Operator [](key As Key) As Object
[310]93 Return Item[key]
94 End Function
95
96 Sub Operator []=(key As Key, value As T)
97' Item[key] = vaule
98 End Sub
99*/
100 'Methods
101 Sub Add(key As Key, value As T)
[537]102 If ActiveBasic.IsNothing(key) Then
103 Throw New ArgumentNullException("key")
[310]104 End If
105
[393]106 Dim hash = getHash(key)
[310]107 Dim a = al[hash] As ArrayList
108
[537]109 If ActiveBasic.IsNothing(a) Then
[310]110 a = New ArrayList
111 al[hash] = a
112 Else
113 Dim i As Long
114 For i = 0 To ELM(a.Count)
[393]115 Dim pair = a[i] As Detail.Pair
[310]116 If pair.Key.Equals(key) Then
117 'Throw ArgumentError
118 End If
119 Next
120 End If
121
[393]122 a.Add(New Detail.Pair(key, value))
[366]123
[393]124 count++
[310]125 End Sub
126
127 Sub Clear()
128 Dim i As Long
129 For i = 0 To ELM(al.Count)
130 al[i] = Nothing
131 Next
132 End Sub
133
[366]134 Function Count() As Long
135 Return count
136 End Function
137
[542]138 /*!
139 @biref 指定されたキーが格納されているか調べる。
140 @date 2008/07/11
141 @param[in] key 検索対象のキー
142 @retval True 格納されていたとき
143 @retval False 格納されていなかったとき
144 @throw ArgumentNullException keyがNothingだったとき
145 @author Egtra
146 */
147 Function ContainsKey(key As Key) As Boolean
148 If ActiveBasic.IsNothing(key) Then
149 Throw New ArgumentNullException("key")
150 End If
151 ContainsKey = False
152
153 Dim hash = getHash(key)
154 Dim a = al[hash] As ArrayList
155
156 If Not ActiveBasic.IsNothing(a) Then
157 Dim i As Long
158 For i = 0 To ELM(a.Count)
159 Dim pair = a[i] As Detail.Pair
160 If pair.Key.Equals(key) Then
161 ContainsKey = True
162 Exit Function
163 End If
164 Next
165 End If
166 End Function
167
[310]168' Function ContainsValue(value As T) As Boolean
169' End Function
170' Function GetEnumerator() As Enumerator
[537]171
172 /*!
173 @biref 指定されたキーの要素を削除する。
174 @date 2008/07/11
175 @param[in] key 削除対象のキー
176 @retval True 対象要素が見つかって削除されたとき
177 @retval False 見つからず削除されなかったとき
178 @author Egtra
179 */
180 Function Remove(key As Key) As Boolean
181 Remove = False
182 If Not ActiveBasic.IsNothing(key) Then
183 Dim hash = getHash(key)
184 Dim a = al[hash] As ArrayList
185 If Not ActiveBasic.IsNothing(a) Then
186 Dim i As Long
187 For i = 0 To ELM(a.Count)
188 Dim pair = a[i] As Detail.Pair
189 If pair.Key.Equals(key) Then
190 a.RemoveAt(i)
191 Remove = True
192 count--
193 Exit Function
194 End If
195 Next
196 End If
197 End If
198 End Function
199
[542]200 Function TryGetValue(key As Key, ByRef value As T) As Boolean
201 If ActiveBasic.IsNothing(key) Then
202 Throw New ArgumentNullException("key")
203 End If
204 TryGetValue = False
205 value = Nothing
[310]206
[542]207 Dim hash = getHash(key)
208 Dim a = al[hash] As ArrayList
209
210 If Not ActiveBasic.IsNothing(a) Then
211 Dim i As Long
212 For i = 0 To ELM(a.Count)
213 Dim pair = a[i] As Detail.Pair
214 If pair.Key.Equals(key) Then
215 TryGetValue = True
216 value = pair.Value
217 Exit Function
218 End If
219 Next
220 End If
221 End Function
222
[310]223 'Classses
224' Class KeyCollection
225' Class ValuesCollection
226' Class Enumerator
227
228Private
229
230' comp As System.Collections.Generic.Detail.DefaultEqualityComparer<Key> 'IEqualityComparer<Key>
231
232 Sub initialize(c As Long)
233 al = ArrayList.Repeat(Nothing, c)
[366]234 count = 0
[310]235 End Sub
236
[393]237 Function getHash(key As Object) As Long
238 Return (key.GetHashCode As DWord) Mod al.Count
239 End Function
240
[310]241 al As ArrayList
[366]242 count As Long
[310]243
244End Class
245
246End Namespace 'Generic
247End Namespace 'Collections
248End Namespace 'System
Note: See TracBrowser for help on using the repository browser.