1、Delphi XE 泛型使用全集队 栈 字典 列表 对象列表详测 Generics Collections TQueueuses Generics.Collections;procedure TForm1.Button1Click(Sender: TObject);var Queue: TQueue; s,str: string; List: TList;begin Queue := TQueue.Create(); 入列 Queue.Enqueue(AAA); Queue.Enqueue(BBB); Queue.Enqueue(CCC); Queue.Enqueue(DDD); 查看 str
2、 := ; for s in Queue do str := str + s + ; ShowMessage(str); AAA BBB CCC DDD 出列, 并查看出列元素 ShowMessage(Queue.Dequeue); AAA str := ; for s in Queue do str := str + s + ; ShowMessage(str); BBB CCC DDD 查看下一个将要出列的是. ShowMessage(Queue.Peek); BBB Queue.Free;/从 TList 建立 TQueue List := TList.Create(); List.Ad
3、dRange(AA, BB, CC); Queue := TQueue.Create(List); str := ; for s in Queue do str := str + s + ; ShowMessage(str); AA BB CC ShowMessage(IntToStr(Queue.Count); 3 Queue.Clear; ShowMessage(IntToStr(Queue.Count); 0 /Queue.TrimExcess; TrimExcess 方法在 Queue 好像没有存在的意义 List.Free; Queue.Free;end;详测 Generics Co
4、llections TQueue (3): OnNotify、Extract/uses Generics.Collections;准备给 TQueue.OnNotify 调用的事件过程procedure TForm1.MyQueueNotify(Sender: TObject; const Item: Integer; Action: TCollectionNotification);begin case Action of cnAdded : ShowMessageFmt(Add: %d, Item); cnRemoved : ShowMessageFmt(Remove: %d, Item)
5、; cnExtracted : ShowMessageFmt(Extract: %d, Item); end;end;procedure TForm1.Button1Click(Sender: TObject);var Queue: TQueue;begin Queue := TQueue.Create(); Queue.OnNotify := MyQueueNotify; Queue.Enqueue(11); Add: 11 Queue.Enqueue(22); Add: 22 Queue.Enqueue(33); Add: 33 Queue.Dequeue; Remove: 11 / Ex
6、tract 和 Dequeue 功能一致, 区别只是在驱动 OnNotify 事件时传递的参数有区别, 没多大意义 Queue.Extract; Extract: 22 /Queue.OnNotify := nil; Queue.Free; Remove: 33end;详测 Generics Collections TStack(1): Push、Pop、Peek - 其他功能同 TQueueuses Generics.Collections;procedure TForm1.Button1Click(Sender: TObject);var Stack: TStack; s,str: str
7、ing;begin Stack := TStack.Create(); 压栈 Stack.Push(AAA); Stack.Push(BBB); Stack.Push(CCC); str := ; for s in Stack do str := str + s + ; ShowMessage(str); AAA BBB CCC 出栈: 后进的先出 Stack.Pop; str := ; for s in Stack do str := str + s + ; ShowMessage(str); AAA BBB 下一个将要出栈的. ShowMessage(Stack.Peek); BBB St
8、ack.Free;end;详测 Generics Collections TDictionary(1):uses Generics.Collections;procedure TForm1.Button1Click(Sender: TObject);var Dictionary: TDictionary; K: string; V: Integer; str: string; b: Boolean; T: Integer; ds: TDictionary.TPairEnumerator; ks: TDictionary.TKeyEnumerator; vs: TDictionary.TValu
9、eEnumerator;begin Dictionary := TDictionary.Create(); 添加 Dictionary.Add(n1, 111); Dictionary.Add(n2, 222); Dictionary.Add(n3, 333); 访问 ShowMessage(IntToStr(Dictionaryn2); 222 ShowMessage(IntToStr(Dictionary.Itemsn2); 222 遍历 Keys str := ; for K in Dictionary.Keys do str := str + K + ; ShowMessage(str
10、); n2 n3 n1 /顺序乱了? 遍历 Values str := ; for V in Dictionary.Values do str := str + IntToStr(V) + ; ShowMessage(str); 222 333 111 通过 Keys 遍历 Values str := ; for K in Dictionary.Keys do str := str + IntToStr(DictionaryK) + ; ShowMessage(str); 222 333 111 删除 Dictionary.Remove(n1); str := ; for K in Dicti
11、onary.Keys do str := str + IntToStr(DictionaryK) + ; ShowMessage(str); 222 333 取数量、清空 ShowMessage(IntToStr(Dictionary.Count); 2 Dictionary.Clear; ShowMessage(IntToStr(Dictionary.Count); 0 判断指定的 Key 是否存在 b := Dictionary.ContainsKey(n1); ShowMessage(BoolToStr(b, True); True b := Dictionary.ContainsKey
12、(n4); ShowMessage(BoolToStr(b, True); False 判断指定的 Value 是否存在 b := Dictionary.ContainsValue(111); ShowMessage(BoolToStr(b, True); True b := Dictionary.ContainsValue(999); ShowMessage(BoolToStr(b, True); False 使用 AddOrSetValue 时, 如果 Key 存在则替换值; 此时如果用 Add 将发生异常 Dictionary.AddOrSetValue(n1, 123); ShowMe
13、ssage(IntToStr(Dictionaryn1); 123 使用 AddOrSetValue 时, 如果 Key 不存在则同 Add Dictionary.AddOrSetValue(n4, 444); ShowMessage(IntToStr(Dictionaryn4); 444 尝试取值 if Dictionary.TryGetValue(n2, T) thenShowMessage(IntToStr(T); 222 ds := Dictionary.GetEnumerator; while ds.MoveNext do ShowMessageFmt(%s:%d, ds.Curre
14、nt.Key, ds.Current.Value); n2:222 n3:333 n1:111 ks := Dictionary.Keys.GetEnumerator; while ks.MoveNext do ShowMessageFmt(%s, ks.Current); n2 n3 n1 vs := Dictionary.Values.GetEnumerator; while vs.MoveNext do ShowMessageFmt(%d, vs.Current); 222 333 111 ExtractPair 应是提取元素, 但它的返回值有些问题; 该函数源码有待修改 Diction
15、ary.ExtractPair(n1); ShowMessage(IntToStr(Dictionary.Count); 2 Dictionary.Free;end;详测 Generics Collections TDictionary(4): OnKeyNotify、OnValueNotifyinterfaceuses Generics.Collections;implementationprocedure TForm1.KeyNotify(Sender: TObject; const Item: string; Action: TCollectionNotification);begin
16、case Action of cnAdded : ShowMessageFmt(Key_Add: %s, Item); cnRemoved : ShowMessageFmt(Key_Remove: %s, Item); cnExtracted : ShowMessageFmt(Key_Extract: %s, Item); end;end;procedure TForm1.ValueNotify(Sender: TObject; const Item: Integer; Action: TCollectionNotification);begin case Action of cnAdded
17、: ShowMessageFmt(Value_Add: %d, Item); cnRemoved : ShowMessageFmt(Value_Remove: %d, Item); cnExtracted : ShowMessageFmt(Value_Extract: %d, Item); end;end; procedure TForm1.Button1Click(Sender: TObject);var Dictionary: TDictionary;begin Dictionary := TDictionary.Create(); Dictionary.OnKeyNotify := Ke
18、yNotify; Dictionary.OnValueNotify := ValueNotify; Dictionary.Add(n1, 111); Key_Add: n1; Value_Add: 111 Dictionary.Add(n2, 222); Key_Add: n2; Value_Add: 222 Dictionary.AddOrSetValue(n1, 123); Value_Remove: 111; Value_Add: 123 Dictionary.Remove(n1); Key_Remove: n1; Value_Remove: 111 Dictionary.Extract
19、Pair(n2); Key_Extract: n2; Value_Extract: 222 Dictionary.OnKeyNotify := nil; Dictionary.OnValueNotify := nil; Dictionary.Free;end;详测 Generics Collections TDictionary(5): 多种 Create 手段uses Generics.Collections, Generics.Defaults;/Create 可以指定元素数, 这样可以提前分配空间以加快速度procedure TForm1.Button1Click(Sender: TOb
20、ject);var Dictionary: TDictionary;begin Dictionary := TDictionary.Create(3); Dictionary.Add(n1, 111); Dictionary.Add(n2, 222); Dictionary.Add(n3, 333); Dictionary.Free;end;/Create 可以有一个 IEqualityComparer 参数, 用于判断 Key 怎样才是相同procedure TForm1.Button2Click(Sender: TObject);var Dictionary: TDictionary; E
21、qualityComparer: IEqualityComparer; 相等对比器begin 通过 IEqualityComparer 让 TDictionary 的 Key 忽略大小写 EqualityComparer := TEqualityComparer.Construct( function(const Left, Right: string): Boolean begin Result := LowerCase(Left) = LowerCase(Right); end, function(const Value: string): Integer begin Result :=
22、StrToIntDef(Value, 0); 我暂时不知道这个函数的作用, 随便写的 end ); Dictionary := TDictionary.Create(EqualityComparer); Dictionary.Add(n1, 111); Dictionary.Add(n2, 222); Dictionary.Add(n3, 333); 如果不是如上建立, 下面这句将会产生一个新元素, 而不是更新 n1 的值 Dictionary.AddOrSetValue(N1, 123); ShowMessage(IntToStr(Dictionaryn1); 123 Dictionary.
23、Free;end;/Create 可以同时指定上面两个参数procedure TForm1.Button3Click(Sender: TObject);var Dictionary: TDictionary; EqualityComparer: IEqualityComparer;begin EqualityComparer := TEqualityComparer.Construct( function(const Left, Right: string): Boolean begin Result := LowerCase(Left) = LowerCase(Right); end, fu
24、nction(const Value: string): Integer begin Result := StrToIntDef(Value, 0); end ); Dictionary := TDictionary.Create(9, EqualityComparer); Dictionary.Add(n1, 111); Dictionary.AddOrSetValue(N1, 123); ShowMessage(IntToStr(Dictionaryn1); 123 指定元素数后, 用不了的可以释放 Dictionary.TrimExcess; Dictionary.Free;end;/可
25、通过另一个 TDictionary 建立一个新的 TDictionaryprocedure TForm1.Button4Click(Sender: TObject);var Dictionary, DictionaryTmp: TDictionary; pair: TPair;begin DictionaryTmp := TDictionary.Create(); DictionaryTmp.Add(n1, 111); DictionaryTmp.Add(n2, 222); DictionaryTmp.Add(n3, 333); 通过另一个 TDictionary 建立 Dictionary
26、:= TDictionary.Create(DictionaryTmp); 遍历看看 for pair in Dictionary do ShowMessage(IntToStr(Dictionarypair.Key); 222 333 111 DictionaryTmp.Free; Dictionary.Free;end;/通过另一个 TDictionary 建立时, 可同时再指定 相等对比器procedure TForm1.Button5Click(Sender: TObject);var Dictionary, DictionaryTmp: TDictionary; pair: TPai
27、r; EqualityComparer: IEqualityComparer;begin DictionaryTmp := TDictionary.Create(); DictionaryTmp.Add(n1, 111); DictionaryTmp.Add(n2, 222); DictionaryTmp.Add(n3, 333); 再做个对比器 EqualityComparer := TEqualityComparer.Construct( function(const Left, Right: string): Boolean begin Result := LowerCase(Left) = LowerCase(Right); end, function(const Value: string): Integer begin Result :=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1