Delphi7中 自己创建HashTable

谁说Delphi没有哈希?--Delphi中,TStringList和THashedStringList的性能对比 曾经看到很多人在嚷嚷Delphi没有哈希表,这些人的动手意识姑且不论,却还有很多人以此来证明Delphi比别的语言垃圾,实在是...好,牢骚打住,转接正题。TStringList是我们常用的字符串列表类型,用法就不在这里赘述,但是,在数据其项数增多时,其搜索(主要是name/key搜索和indexof搜索)性能会急剧下降,原因是TStringList的内部存储使用了链表形式,而搜索操作使用 阅读详情

在Delphi7 以下版本中,我们发现库是不带HashTable这个类的,而这个类在java中被应用得风生水起。

一直想用Delphi7开发简单的数据库处理程序,但是我不想用Delphi中的那些个自动化的控件,不可控,不自由。

于是参照java,自己开发了很多类,包含字符串处理的,集合类。

对于多线程编程,队列也是一个基本类,一并开发了。自己开发的类有一个好处,就是方法随便添加,根据需要可以自由优化。那些通用的类和方法,通常性能是很差的,就如一个循环队列,Delphi本身就没有,别人开发的,测试了下,性能低得很。对于大数据量来说,线程池调度、队列等算法就很有发挥空间。

原来对java哈希表感觉很是神奇,其查询速度快得出奇,后来看了下其原理,才清楚背后的数学逻辑。

自己学着编写了一下,感觉还是不错的。对不同的hash函数进行了可视化的测试。

用一个GRID控件显示,来看下hash值分布情况,一目了然。对于不同的key类型测试,当然越均匀越好。

 

unit RSHashtable;
    
interface
    
uses  Windows,Classes, RSBase, sysutils;

type

 { TRSHashTable }

      PPRSHashItem = ^PRSHashItem;      //如果采用双向链表则不需要复指针。
      PRSHashItem = ^TRSHashItem;
      TRSHashItem = record
         Next: PRSHashItem;
         Key: string;
         IntValue: Integer;
         StrValue: String;     //double 采用string保存,FloatToStr
         Objvalue: TObject;
      end;

      TRSHashTable = class(TRSThreadObject)
      private
         FItemCount:cardinal;
         FArraySize: cardinal;
         FMaxTableSize:cardinal;
         FMulti: boolean;
         FAutoGrowth:boolean;      //不容许自动增长则是线程安全的。
         ArrayTable: array of PRSHashItem;
         function createHashItem(const Key: string):PRSHashItem;
      protected
         function Find(const Key: string): PPRSHashItem;
         function FindByCode(hashcode:cardinal;key:String): PPRSHashItem;
         function HashOf(const Key: string): Cardinal; virtual;
      public
         constructor Create(Size: Integer = 256; multi:boolean = false; AutoGrowth:boolean=true);
         destructor Destroy; override;
         function  GetInteger(const Key: String): Integer;
         function  GetString(const Key: String): String;
         function  GetObject(const Key: string): TObject;
         function  GetItem(const key:String): TRSHashItem;
         function  keyExists(const Key: String): boolean;
         function  GetArrayTable: Pointer;
         function  KeyToList(key:String;isStartWithKey:boolean=false):TStringList;
         function  ObjValueToList():TList;overload;
         function  ObjValueToListEx(key:String;isStartWithKey:boolean=false):TList;overload;
         function  KeyStrValueToList(key:String;isStartWithKey:boolean=false):TStringList;
         function  KeyIntValueToList(key:String;isStartWithKey:boolean=false):TStringList;
         procedure Put(const Key: string; Value:Integer);overload;
         procedure Put(const Key: string; Value:String);overload;
         procedure Put(const Key: string; Value:TObject);overload;
         procedure Clear;
         procedure Remove(const Key: string);
         procedure RemoveKey(const Key: string); //不释放对象
         procedure RemoveAll(const Key: string);
         procedure RemoveValue(const Key: string; aValue:String);
         procedure SetSize(size:Cardinal);
         procedure SetMaxTableSize(const size:Cardinal);
         property  count:cardinal  read FItemCount;
         property  size:cardinal  read FArraySize write SetSize;
         property  MaxTableSize:cardinal  read FMaxTableSize write SetMaxTableSize;
      end;

 { Iterator 迭代器通常不用作线程共享,因此没有实现线程安全}
      TIterator = class
      private
         FTable: TRSHashTable;
         ArrayTable: array of PRSHashItem;
         crtItem: PRSHashItem;
         crtIndex: cardinal;
         key: String;
         procedure findNextLink;
      public
         constructor Create(table: TRSHashTable;const key:String);
         function next:boolean;
         function getkey:String;
         function getInteger:Integer;
         function getString:String;
         function getObject:TObject;
      end;

const
   MAX_HASHTABLE_SIZE = 50000;
implementation
   uses RSFunctions;
 { TRSHashTable }

  {如果容许保存重复key项目,则首先从表查询,如果没有查找到,则创建}
    function TRSHashTable.createHashItem(const Key: string): PRSHashItem;
    var
      Hash: Integer;
      HashItem: PRSHashItem;
    begin
      Hash := HashOf(Key) mod FArraySize;
      result := nil;
      if not FMulti then
         result := FindByCode(Hash,key)^;
      if result = nil then
      begin
         New(HashItem);
         fillChar(HashItem^,sizeof(TRSHashItem),0);
         HashItem^.Key := Key;
         HashItem^.Next := ArrayTable[Hash];
         ArrayTable[Hash] := HashItem;
         result := HashItem;
         inc(FItemCount);
         if FAutoGrowth and (FArraySize < FMaxTableSize) and (FItemCount > 2*FArraySize) then  // FAutoGrowth and
            setSize(FItemCount);           //如果中途修改FMaxTableSize,则最大尺寸变成了FItemCount
       end;
   end;

    procedure TRSHashTable.Put(const Key: string; Value: Integer);
    begin
      Lock;
      try
         createHashItem(key).IntValue :=  value;
      finally
         UnLock;
      end; 
    end;

    { 字符串操作是非原子操作,非线程安全的 }
    procedure TRSHashTable.Put(const Key: string; Value: String);
    begin
      Lock();
      try
         createHashItem(key).StrValue :=  value;
      finally
         UnLock;
      end;
      //StrAlloc和StrDispose
    end;

    procedure TRSHashTable.Put(const Key: string; Value: TObject);
    begin
      Lock;
      try
         createHashItem(key).ObjValue :=  value;
      finally
         UnLock;
      end;
    end;

    function TRSHashTable.keyExists(const Key: String): boolean;
    begin
      Lock;
      try
         Result := Find(Key)^ <> nil;
      finally
         UnLock;
      end;
    end;

    function TRSHashTable.GetInteger(const Key: String): Integer;
    var
      P: PRSHashItem;
    begin
      Lock;
      try
         P := Find(Key)^;
         if P <> nil then
            Result := P^.IntValue
         else
            Result := 0;
      finally
         UnLock;
      end;
    end;

    function TRSHashTable.GetString(const Key: String): String;
    var
      P: PRSHashItem;
    begin
      Lock();
      try
         P := Find(Key)^;
         if P <> nil then
            Result := P^.StrValue
         else
            Result := '';
      finally
         UnLock();
      end;
    end;

    function TRSHashTable.GetObject(const Key: string): TObject;
    var
      P: PRSHashItem;
    begin
      Lock();
      try
         P := Find(Key)^;
         if P <> nil then
            Result := P^.ObjValue
         else
            Result := nil;
      finally
         UnLock();
      end;
    end;

    function TRSHashTable.GetItem(const key:String): TRSHashItem;      //直接指针引用,非线程安全,除非直接copy,然后释放锁
    begin
       result := Find(Key)^^;
    end;

    function  TRSHashTable.GetArrayTable:Pointer;
    begin
        result := ArrayTable;
    end;

    procedure TRSHashTable.Clear;
    var
      I: Integer;
      P, N: PRSHashItem;
    begin
      Lock();
      try
          for I := 0 to FArraySize - 1 do
          begin
              P := ArrayTable[I];
              while P <> nil do
              begin
                N := P^.Next;
                if p^.ObjValue <> nil then
                   p^.ObjValue.Free;
                Dispose(P);                //清空节点下的对象
                P := N;
              end;
              ArrayTable[I] := nil;        //节点清除
          end;
          FItemCount := 0;
      finally
         UnLock();
      end;
    end;

    constructor TRSHashTable.Create(Size: Integer; multi:boolean; AutoGrowth:boolean);   //;
    begin
      inherited Create;
      FArraySize := size;
      SetLength(ArrayTable,FArraySize);
      fillChar(ArrayTable[0],sizeof(integer)*Size,0);   //2017.3.24 setLength会自动清0
      FItemCount := 0;
      MaxTableSize := MAX_HASHTABLE_SIZE;
      if MaxTableSize < size then
         MaxTableSize := size;
      self.FAutoGrowth := AutoGrowth;
      self.FMulti := multi;
    end;
    
    destructor TRSHashTable.Destroy;
    begin
      Clear;
      inherited;
    end;


    function TRSHashTable.Find(const Key: string): PPRSHashItem;  //线程不安全,setSize时查询
    var
      Hash: Integer;
    begin
      Hash := HashOf(Key) mod FArraySize;
      Result := FindByCode(Hash,key);
    end;

    function TRSHashTable.FindByCode(hashcode:cardinal; key:String): PPRSHashItem;  //线程不安全
    begin
      Result := @ArrayTable[hashcode];
      while Result^ <> nil do
      begin
         if Result^.Key = Key then
            Exit
         else
            Result := @Result^.Next;
      end;
    end;


    procedure TRSHashTable.Remove(const Key: string);
    var
      P: PRSHashItem;
      Prev: PPRSHashItem;
    begin
      Lock();
      try
         Prev := Find(Key);  //如果没有该key, find返回的是数组表格的地址, 以hashcode为下标。
         P := Prev^;         //槽内指向的对象
         if P <> nil then
         begin
           Prev^ := P^.Next;
           if p^.ObjValue <> nil then
           try
              p^.ObjValue.Free;
           except
           end;
           Dispose(P);  //删除Item
          // p := nil;    //清除上一个的 Next 内容。
           DEC(FItemCount);
         end;
      finally
        UnLock();
      end;
    end;

    procedure TRSHashTable.RemoveKey(const Key: string);
    var
      P: PRSHashItem;
      Prev: PPRSHashItem;
    begin
      Lock();
      try
         Prev := Find(Key);
         P := Prev^;
         if P <> nil then
         begin
           Prev^ := P.Next;
           Dispose(P);
          // p := nil;    //清除上一个的 Next 内容。
           DEC(FItemCount);
         end;
      finally
        UnLock();
      end;
    end;
    procedure TRSHashTable.RemoveAll(const Key: string);
    var
      P: PRSHashItem;
      Prev: PPRSHashItem;
    begin
      Prev := Find(Key);
      P := Prev^;
      while (P <> nil) do
      begin
        if (P^.Key <> Key) then begin
           P := P^.Next;
           continue;
        end;
        Prev^ := P^.Next;
        if p^.ObjValue <> nil then
        try
           p^.ObjValue.Free;
        except
        end;
        Dispose(P);
        p := Prev^;
      end;
      FItemCount := 0;
    end;

    procedure TRSHashTable.RemoveValue(const Key: string; aValue:String);
    var
      P: PRSHashItem;
      Prev: PPRSHashItem;
    begin
      Prev := Find(Key);
      P := Prev^;
      while (P <> nil) do
      begin
        if (P^.Key = Key) and (p^.StrValue = aValue) then
        begin
          Prev^ := P^.Next;
          Dispose(P);
          DEC(FItemCount);
          break;
        end;
        p := p^.Next;   
      end;
    end;

    {创建临时表,将原来的item按照新的表重新hash,}
    procedure TRSHashTable.SetSize(size: cardinal);     //非线程安全,如果要严格线程安全,则读取的时候也要上锁
    var
      tempArrayTable: Array of PRSHashItem;
      I,Hash: Integer;
      P,N,Prev: PRSHashItem;
    begin
      if not FAutoGrowth then exit;
      if size <FArraySize     then exit;
      if size > FMaxTableSize then
         size := FMaxTableSize;
      Lock();
      try
     // ReallocMem(tempArrayTable,sizeof(PRSHashItem));   //setLength
      SetLength(tempArrayTable,size);
      fillChar(tempArrayTable[0],sizeof(integer)*Size,0);   //2017.3.24 setLength会自动清0
      for I := 0 to FArraySize - 1 do
      begin
         P := ArrayTable[I];
         while P <> nil do
         begin
            Hash := HashOf(P^.Key) mod size;   //注意是新的size
            N := tempArrayTable[Hash];           //此处处理顺序问题,如果不按照顺序,那么多个key相同时只能取到第一个值,而不是最新的值。
            Prev := N;
            while N <> nil do                 //如果一个重复Key很多,这里就会搜索到末尾需要很长时间
            begin
               Prev := N;
               N := N^.Next;
            end;
           N := P^.Next;
           P^.Next := nil;
           if Prev = nil then
               tempArrayTable[Hash] := P
           else
               Prev^.Next := P;
           {
           N := P^.Next;
           P^.next := tempArrayTable[Hash];
           tempArrayTable[Hash]:= P;
           }
           P := N;
         end;
         ArrayTable[I] := nil;
      end;

      FArraySize := size;
      setLength(ArrayTable,FArraySize);
      for I := 0 to FArraySize - 1 do
         ArrayTable[i] := tempArrayTable[i];
      finally
        UnLock();
      end;
    end;

    procedure TRSHashTable.SetMaxTableSize(const size: cardinal);   //非线程安全
    begin
       if size > FArraySize then        //不能减小
          FMaxTableSize := size;
    end;


   {以下编译选项:Q表示是否打开运行时检查,有Range检查和溢出检查,这在项目属性中设置,如果项目设置了溢出检查,
     这里则关闭,否则总是跳出错误}
   {$UNDEF SaveQ} {$IFOPT Q+} {$Q-} {$DEFINE SaveQ} {$ENDIF}
    function TRSHashTable.HashOf(const Key: string): Cardinal;
    var
      I,k: Integer;
    begin
       result := 5381;
       k := Length(key);
       for I := 1 to k do
          result := (result shl 5) +result + Ord(Key[I]);
    end;
    {$IFDEF SaveQ} {$Q+} {$UNDEF SaveQ} {$ENDIF}

    function TRSHashTable.ObjValueToList():TList;
    var
      Iterator: TIterator;
      crtItem : PRSHashItem;
      i:Integer;
    begin
       result := TList.Create;
       crtItem := nil;
       for i:=0 to  FArraySize-1 do
       begin
          crtItem := ArrayTable[i];
          if crtItem=nil then
             continue;
          repeat
             result.Add(crtItem.Objvalue);
             crtItem := crtItem.Next;
          until crtItem = nil;
       end;
    end;

    function TRSHashTable.ObjValueToListEx(key:String;isStartWithKey:boolean):TList;
    var
      Iterator: TIterator;
      crtItem : PRSHashItem;
      i:Integer;
    begin
       result := TList.Create;
       crtItem := nil;
       for i:=0 to  FArraySize-1 do
       begin
          crtItem := ArrayTable[i];
          if crtItem=nil then
             continue;
          repeat
             if key='' then
                result.Add(crtItem.Objvalue)
             else if ((not isStartWithKey) and (key = crtItem.Key))
                or ( isStartWithKey and (startWiths(crtItem.Key,key))) then
               result.Add(crtItem.Objvalue);
             crtItem := crtItem.Next;
          until crtItem.Next = nil;
       end;
    end;
    {    var
      Iterator: TIterator;
    begin
       result := TStringList.Create;
       Iterator := TIterator.Create(self,key,isStartWithKey);
       while Iterator.next do
          result.Add(Iterator.getkey());}
          
    function TRSHashTable.KeyToList(key:String;isStartWithKey:boolean):TStringList;
    var
      Iterator: TIterator;
    begin
       result := TStringList.Create;
       Iterator := TIterator.Create(self,key);
       while Iterator.next do
          result.Add(Iterator.getkey());
    end;

    function TRSHashTable.KeyStrValueToList(key:String;isStartWithKey:boolean):TStringList;
    var
      Iterator: TIterator;
    begin
       result := TStringList.Create;
       Iterator := TIterator.Create(self,key);
       while Iterator.next do
       begin
          result.Add(Iterator.getkey()+'='+Iterator.getString());
        end;
    end;
    
    function TRSHashTable.KeyIntValueToList(key:String;isStartWithKey:boolean):TStringList;
    var
      Iterator: TIterator;
    begin
       result := TStringList.Create;
       Iterator := TIterator.Create(self,key);
       while Iterator.next do
          result.Add(Iterator.getkey()+'='+IntToStr(Iterator.getInteger()));
    end;
        
     {Iterator}

    constructor TIterator.Create(table: TRSHashTable;const key:String);
    begin
       self.FTable := table;
       self.key := key;
       crtIndex := 0;
       ArrayTable := table.GetArrayTable;
    end;


    procedure TIterator.findNextLink;
    begin
       if key <>'' then
          crtItem := FTable.Find(key)^
       else
       begin
          while crtItem = nil do
          begin
             if (crtIndex > Ftable.size-1) then
                break;
             crtItem := ArrayTable[crtIndex];
             inc(crtIndex);
          end;
       end;
    end;

    //遍历所有Item
    function TIterator.next:boolean;
    begin
       result := false;
       if crtItem = nil then //当前不能为空
          findNextLink
       else
          crtItem := crtItem^.Next;

       if key = '' then
       begin
          if crtItem = nil then   //如果没有找到,如果是链表尾部还要找一次数组
              findNextLink;
          if crtItem  <> nil then
             result := true;
       end
       else
       begin
          while (crtItem <> nil) and (crtItem^.Key <> key) do
             crtItem := crtItem^.Next;
          if crtItem  <> nil then
             result := true;
       end;
    end;

    function TIterator.getInteger:Integer;
    begin
       if crtItem <> nil then
          result := crtItem^.IntValue
       else
          result := 0;
    end;

    function TIterator.getString:String;
    begin
       if crtItem <> nil then
          result := crtItem^.StrValue
       else
          result := '';
    end;

    function TIterator.getObject:TObject;
    begin
       if crtItem <> nil then
          result := crtItem^.Objvalue
       else
          result := nil;
    end;

    function TIterator.getKey:String;
    begin
       if crtItem <> nil then
          result := crtItem^.key
       else
          result := '';
    end;


end.
 

delphi 哈希表的简单实现案例 遇到一个需要使用键值对的小功能,原先的设计是通过读取配置文件的方式完成的,这样每一个各户需求不同,每个产品都需要进行机械的修改,使用哈希表减少了重复的操作。 立即下载

相关推荐

【嵌入式】树莓派部署NCNN的YOLOv5模型

树莓派部署NCNN框架的YOLOv5模型

Ace_Spade的博客 3782

Delphi实现Hash表

Hash表,其实就是一个Key对应一个Object在Delphi里最简单实现Hash的就是TStrings通过它的AddObject,IndexOf,Objects等方法可以做一个很简单的Hash表。TStrings没有排序,所以IndexOf比较慢,而它的子类TStringList具有Stored属性,设置为True之后,IndexOf是用折半查找的,效率很高。所以在Delphi里可以用Tstr

记录成长的每一步 5212

数学建模常用模型10 :数据包络(DEA)分析法(投入产出法)

数据包络分析是评价多输入指标和多输出指标的较为有效的方法,将投入与产出进行比较。它的结果包含的意思有: ①θ=1,DEA有效,表示投入与产出比达到最优 ②θ&lt;1,非DEA有效,表示投入与产出比没有达到最优,一般来说,θ越大说明效果越好。 数据包络分析是通过对投入的指标和产出的指标做了一个线性规划,并且进行变换后,然后根据其线性规划的对偶问题(线性规划对偶问题具有经济学意义),求解这个对...

HaLosec_Wei 9万+

Delphi 中哈希表TStringHash和THashedStringList性能速度

Delphi的IniFiles单元中有两个哈希表类TStringHash和THashedStringList 【TStringHash】 优点:速度快,尤其是添加时(调用.Add)速度比THashedStringList快得多。 缺点: 1、Key只能是字符串,Value只能是数字 2、无法进行遍历 【THashedStringList】 优点:继承与TStringL

正己的专栏 5260

AB SCIEX质谱数据分析实战:从PeakView入门到精通

质谱分析是现代生命科学和药物研发中不可或缺的核心技术,它通过测量离子的质荷比来鉴定和定量化合物。其基本原理是将样品离子化后,在电场和磁场中按质荷比分离,最终形成质谱图。这项技术的核心价值在于能够从复杂混合物中高灵敏度、高特异性地获取化合物的定性和定量信息,广泛应用于代谢组学、蛋白质组学、环境监测和药物分析等领域。在实际工作中,高效的数据处理平台至关重要。以AB SCIEX质谱仪生成的.wiff文件为例,其原始数据需要专业软件进行解析。PeakView软件正是这样一个综合平台,它集成了高级数据处理、谱图解析和

weixin_29053577的博客 307

奇异值分解(SVD)C++实现

奇异值分解SVD(紧奇异值分解,截断奇异值分解)C++实现

weixin_45804601的博客 4172

Delphi中类似Map的HashTable

From: http://topic.youkuaiyun.com/t/20050518/10/4015559.html unit   UnitHasedTable;         interface     uses         Classes;         type         TStringHashedTable   =   class(TPersisten

Newweapon's Trace 1532

现代软件开发技术 | 第1章:Spring基础

Spring是一个轻量级Java 开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。

知识库搭建ing 455

在 Delphi 6 中使用 Hashtable

Java 中的 Hashtable 类小巧好用,尤其是因为采用了哈希算法,查找的速度奇快。后来因工作需要,使用 Delphi 实施一些项目,特别不习惯没有哈希表的日子。于是决定自己动手做一个。  不必白手起家,Delphi 中有一个 THashedStringList 类,它位于 IniFiles 单元中。它里面有一个不错的哈希算法,解决冲突的机制是“链地址”。把这个类改装改装,就成了自己的了。新

lee576的专栏 2248

OpenOCD入门到精通:第20章 Target 子系统源码分析

摘要:本章深入分析OpenOCD Target子系统的核心实现机制。重点包括:1) 通过target_type虚函数表实现多架构抽象,支持ARM、RISC-V等30+种目标;2) ARM ADIv5协议栈实现,包含DAP/AP核心数据结构和访问机制;3) 分层架构设计,从调试接口层到传输层的完整调用链路。系统采用面向对象思想,统一管理目标状态、寄存器缓存、断点/观察点等调试要素,为上层提供标准化的调试操作接口。

从事嵌入式linux android驱动开发,拥有全栈能力 178

PyTorch实战(26)——PyTorch分布式训练

在本节中,我们将探讨如何通过跨机器和机器内多进程的分布式训练来加速模型训练过程。我们将系统学习 PyTorch 提供的三大分布式训练 API——torch.distributed、torch.multiprocessing 以及 torch.utils.data.distributed.DistributedSampler,使用这些 API 能够极大的简化分布式训练,介绍如何使用 PyTorch 的分布式训练工具,在 CPU 和 GPU 上加速训练。

盼小辉丶的博客 3820

Dictionary 和hashtable区别

1:单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分.  2:多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized()   方法可以获得完全线程安全的类型.而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率

yuanyuanispeak的专栏 539

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

多线程之Map:Hashtable HashMap 以及ConcurrentHashMap

1、Map体系 参考:http://java.chinaitlab.com/line/914247.html Hashtable是JDK 5之前Map唯一线程安全的内置实现(Collections.synchronizedMap不算)。Hashtable继承的是Dictionary(Hashtable是其唯一公开的子类),并不继承AbstractMap或者HashMap.尽管Hashtable

冷月宫主的专栏 583

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

转:Linq基础学习

本文为转摘博客园大牛文章之一。 原文地址:http://www.cnblogs.com/foundation/archive/2009/01/05/1369371.html 目录 1LINQ查询结果集1 2System.Array 数组1 2.1基于System.Array定义数组1 2.2基于类型定义数组...

dilian1685的博客 457

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

日期转中文

Code///<summary>///日期转中文///</summary>///<paramname="oldDate"></param>///<returns></returns>publicstaticstri...

weixin_30668887的博客 116

并发容器

1.  ConcurrentHashMap * 本方法测试点(基于jdk1.8):  *   ConcurrentHashMap  *   ConcurrentSkipListMap  *   Hashtable  *   HashMap  *   执行时间对比,Map&lt;String,String&gt; 而Set&lt;String&gt;同理  * 理解:  *   SkipList跳...

清风追梦enjoy的专栏 230

哈希表与字典

首先,哈希表和字典都是可以存储数据的一个容器,都是以键值对的方式来存储数据,一个键对应一个值,通过键和值来检索数据时是十分有效迅速的,举个简单的例子就是我们的手机的电话薄里面都是一个人对应一个电话号码,检索的时候只有找到键,也就是找到人名,就可以找到电话号码了。 字典的存储结构也是通过哈希表来实现的,所以两者存入数据的方式是一样的,但是两者在执行效率上还是有差别的。 一、Hashtabl...

十年磨一剑,沉淀…… 9665

Delphi 中的哈希表(1): THashedStringList

为什么80%的码农都做不了架构师?>>> ...

weixin_34301307的博客 152

求一个字符串的hash值

转载自:http://www.cnblogs.com/jiu0821/p/4554352.html 求一个字符串的hash值: •现在我们希望找到一个hash函数,使得每一个字符串都能够映射到一个整数上 •比如hash[i]=(hash[i-1]*p+idx(s[i]))%mod •字符串:abc,bbc,aba,aadaabac •字符串下标从0开始 •先把a映射为1,b映射为2,c

梧桐下的四叶草 7012

在delphi中"队"如何操作?"

varMyQueue:TQueue; //声明队变量ARecord:^MyName; //一个指针i:integer;ss:String;{初始化部分}MyQueue:=TQueue.Create();{Push部分}for i=0 to 10 dobeginNew(ARecord);//给指针空间ARecord^.filename:=IntToStr(i);MyQueue.Push(ARecor

SilverLong专栏 1360

Delphi的哈希表(一)

Delphi的哈希表(一) 哈希表是通过哈希值来访问的,通过一定的内存浪费获取检索速度,在检索项时是不需要逐一检索。在编程中有一定的好处。 unit Unit1; interface uses Windows, Messages, SysUt...

467

学习笔记:Hashtable和HashMap

学了这么些天的基础知识发现自己还是个门外汗,难怪自己一直混的不怎么样。但这样的恶补不知道有没有用,是不是过段时间这些知识又忘了呢?这些知识平时的工作好像都是随拿随用的,也并不是平时一点没有关注过这些基础知识,只是用完了也就忘了。所以写笔记也是个好习惯,光看一个概念不容易记住,整理写成文那就好许多,以后查起来也方便一些。 为什么要用Hash Table? 这就想到了以前工作中遇到的一个事情。多...

weixin_33910460的博客 170

Delphi下的字符串Hash函数

有点奇怪,我在Google中查找"Delphi 字符串 Hash"居然找不到相关的Hash函数!正当我不知如何是好是,忽然想起开源的JEDI项目,这个大而全的项目虽然我极少使用,但我知道里面什么都有的。一看果然……   下面是我从JEDI里面提取出来的Hash函数: function StrHash(const SoureStr: string): Cardinal;   const    

cmx8818的博客 1819

LeetCode--最长回文子串

public static String longestPalindrome(String s) { if (s == null || s.length() == 0) { return ""; } // 保存起始位置 int[] range = new int[2]; char[] str = s.toCharArray(); // 字符串打散成字符数组 for (int i = 0; i < s.length(); i++) {.

WGS. 430
上一篇: 用java创建一个表达式计算器和脚本解释器
wjgit
博客等级 码龄18年 12粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值