zoukankan      html  css  js  c++  java
  • 使用 Delphi Xe 的 TDictionary

    原本一直使用 TList, 将定义的一个个 Record 保存在TList 里面, 为了能把某些对象管理起来, 例如一个类的 n 多实例,可以进行索引、查找、释放等

    今天刚看到原来已经有了一个叫 TDictionary 对象,用起来挺方便。 挺像我们在DB中定义的 Dictionary 表,Key、Value。  而那个不管Key、Value 都挺发达,允许各种定义的类。 

    ok,下面官方Demo很通俗易懂,各方法都在:

    type
      TCity = class
        Country: String;
        Latitude: Double;
        Longitude: Double;
      end;
     
    const
      EPSILON = 0.0000001;
     
    var
      Dictionary: TDictionary<String, TCity>;
      City, Value: TCity;
      Key: String;
     
    begin
      { Create the dictionary. }
      Dictionary := TDictionary<String, TCity>.Create;
      City := TCity.Create;
      { Add some key-value pairs to the dictionary. }
      City.Country := 'Romania';
      City.Latitude := 47.16;
      City.Longitude := 27.58;
      Dictionary.Add('Iasi', City);
     
      City := TCity.Create;
      City.Country := 'United Kingdom';
      City.Latitude := 51.5;
      City.Longitude := -0.17;
      Dictionary.Add('London', City);
     
      City := TCity.Create;
      City.Country := 'Argentina';
      { Notice the wrong coordinates }
      City.Latitude := 0;
      City.Longitude := 0;
      Dictionary.Add('Buenos Aires', City);
     
      { Display the current number of key-value entries. }
      writeln('Number of pairs in the dictionary: ' +
      IntToStr(Dictionary.Count));
     
      // Try looking up "Iasi".
      if (Dictionary.TryGetValue('Iasi', City) = True) then
      begin
        writeln(
        'Iasi is located in ' + City.Country +
        ' with latitude = ' + FloatToStrF(City.Latitude, ffFixed, 4, 2) +
        ' and longitude = ' + FloatToStrF(City.Longitude, ffFixed, 4, 2)
        );
      end
      else
        writeln('Could not find Iasi in the dictionary');
     
      { Remove the "Iasi" key from dictionary. }
      Dictionary.Remove('Iasi');
     
      { Make sure the dictionary's capacity is set to the number of entries. }
      Dictionary.TrimExcess;
     
      { Test if "Iasi" is a key in the dictionary. }
      if Dictionary.ContainsKey('Iasi') then
        writeln('The key "Iasi" is in the dictionary.')
      else
        writeln('The key "Iasi" is not in the dictionary.');
     
      { Test how (United Kingdom, 51.5, -0.17) is a value in the dictionary but
        ContainsValue returns False if passed a different instance of TCity with the
        same data, as different instances have different references. }
      if Dictionary.ContainsKey('London') then
      begin
        Dictionary.TryGetValue('London', City);
        if (City.Country = 'United Kingdom') and (CompareValue(City.Latitude, 51.5, EPSILON) = EqualsValue) and (CompareValue(City.Longitude, -0.17, EPSILON) = EqualsValue) then
          writeln('The value (United Kingdom, 51.5, -0.17) is in the dictionary.')
        else
          writeln('Error: The value (United Kingdom, 51.5, -0.17) is not in the dictionary.');
        City := TCity.Create;
        City.Country := 'United Kingdom';
        City.Latitude := 51.5;
        City.Longitude := -0.17;
        if Dictionary.ContainsValue(City) then
          writeln('Error: A new instance of TCity with values (United Kingdom, 51.5, -0.17) matches an existing instance in the dictionary.')
        else
          writeln('A new instance of TCity with values (United Kingdom, 51.5, -0.17) does not match any existing instance in the dictionary.');
        City.Free;
      end
      else
        writeln('Error: The key "London" is not in the dictionary.');
     
      { Update the coordinates to the correct ones. }
      City := TCity.Create;
      City.Country := 'Argentina';
      City.Latitude := -34.6;
      City.Longitude := -58.45;
      Dictionary.AddOrSetValue('Buenos Aires', City);
     
      { Generate the exception "Duplicates not allowed". }
      try
        Dictionary.Add('Buenos Aires', City);
      except
        on Exception do
          writeln('Could not add entry. Duplicates are not allowed.');
      end;
     
      { Display all countries. }
      writeln('All countries:');
      for Value in Dictionary.Values do
        writeln(Value.Country);
     
      { Iterate through all keys in the dictionary and display their coordinates. }
      writeln('All cities and their coordinates:');
      for Key in Dictionary.Keys do
      begin
        writeln(Key + ': ' + FloatToStrF(Dictionary.Items[Key].Latitude, ffFixed, 4, 2) + ', ' +
        FloatToStrF(Dictionary.Items[Key].Longitude, ffFixed, 4, 2));
      end;
     
      { Clear all entries in the dictionary. }
      Dictionary.Clear;
     
      { There should be no entries at this point. }
      writeln('Number of key-value pairs in the dictionary after cleaning: ' + IntToStr(Dictionary.Count));
     
      { Free the memory allocated for the dictionary. }
      Dictionary.Free;
      City.Free;
      readln;
    end.
  • 相关阅读:
    STL--set_difference
    priority_queue和sort应用
    16进制转化8进制---map
    LeetCode62. 不同路径
    LeetCode209. 长度最小的子数组
    LeetCode第29场双周赛题解
    LeetCode61. 旋转链表
    LeetCode60. 第k个排列
    LeetCode59. 螺旋矩阵 II
    LeetCode58. 最后一个单词的长度
  • 原文地址:https://www.cnblogs.com/zhenfei/p/4059112.html
Copyright © 2011-2022 走看看