网站数据库怎么做,深圳市住房和建设局网站住房保障服务,信阳有什么推广平台,创建吃的网站怎么做文章目录 TStringList 与TStrings的区别TStringList 常用方法与属性 TStringList 类在Delphi中会经常使用到#xff0c;我们这里一起来看看 TStringList 的详细用法. TStringList 与TStrings的区别
TStringList 和 TStrings 都是 Delphi 编程语言中用于处理字符串列表的类。它… 文章目录 TStringList 与TStrings的区别TStringList 常用方法与属性 TStringList 类在Delphi中会经常使用到我们这里一起来看看 TStringList 的详细用法. TStringList 与TStrings的区别
TStringList 和 TStrings 都是 Delphi 编程语言中用于处理字符串列表的类。它们之间有一些区别但也有关联。让我们先看看它们的关系
TStrings 类
TStrings 是一个抽象类它定义了一组处理字符串列表的基本方法和属性。这个类提供了对字符串列表的访问、修改和管理的基本功能但它本身不能被实例化。TStringList 是 TStrings 的一个具体实现因此它可以被实例化。
TStringList 类
TStringList 继承自 TStrings因此它包含了 TStrings 中定义的所有方法和属性并在此基础上添加了一些额外的功能。是 TStrings 的一个实现用于实际的字符串列表管理。支持排序、查找、插入等功能使其在处理大量字符串时更加高效。
简而言之TStringList 是 TStrings 的一个特定实现提供了更多的功能和性能优化。以下是一些具体的区别 性能 TStringList 在处理大型字符串列表时通常更快因为它包含了一些优化算法比如排序和查找。 功能 TStringList 提供了一些额外的功能如排序、查找、存储对象等而 TStrings 只提供了基本的字符串列表管理功能。 实例化 TStrings 不能直接实例化而必须通过派生类如 TStringList来实现。 用法 TStrings 通常用作函数参数类型或返回类型而 TStringList 用于实际的字符串列表处理。 例子 varMyList: TStringList;
begin// 创建 TStringList 对象MyList : TStringList.Create;// 使用 TStrings 的方法MyList.Add(Item 1);MyList.Add(Item 2);// 使用 TStringList 的方法MyList.Sort;// 释放对象MyList.Free;
end;在实际编码中通常会使用 TStringList因为它提供了更多的功能和更好的性能。
TStringList 常用方法与属性 基本用法 varList: TStringList;i: Integer;
beginList : TStringList.Create;List.Add(Strings1); {添加}List.Add(Strings2);List.Exchange(0,1); {置换}List.Insert(0,Strings3); {插入}i : List.IndexOf(Strings1); {第一次出现的位置}List.Sort; {排序}List.Sorted : True; {指定排序}List.Count; {总数}List.Text; {文本集合}List.Delete(0); {删除, 0是第一个数据}List.LoadFromFile(c:\tmp.txt);{打开}List.SaveToFile(c:\tmp.txt); {保存}List.Clear; {清空}List.Free; {释放}
end;读入字符串 varList: TStringList;
beginList : TStringList.Create;List.CommaText : aaa,bbb,ccc,ddd;//相当于: List.Text : aaa #13#10 bbb #13#10 ccc #13#10 ddd;ShowMessage(IntToStr(List.Count)); //4ShowMessage(List[0]); //aaaList.Free;
end;分隔符操作 varList: TStringList;
beginList : TStringList.Create;List.Delimiter : |;List.DelimitedText : aaa|bbb|ccc|ddd;ShowMessage(IntToStr(List.Count)); //4ShowMessage(List[0]); //aaaList.Free;
end;类似的哈希表操作法 varList: TStringList;
beginList : TStringList.Create;List.Add(aaa111);List.Add(bbb222);List.Add(ccc333);List.Add(ddd444);ShowMessage(List.Names[1]); //bbbShowMessage(List.ValueFromIndex[1]); //222ShowMessage(List.Values[bbb]); //222//ValueFromIndex 可以赋值:List.ValueFromIndex[1] : 2;ShowMessage(List[1]); //bbb2//可以通过 Values 赋值:List.Values[bbb] : 22;ShowMessage(List[1]); //bbb22List.Free;
end;避免重复值 varList: TStringList;
beginList : TStringList.Create;List.Add(aaa);List.Sorted : True; //需要先指定排序List.Duplicates : dupIgnore; //如有重复值则放弃 List.Add(aaa);ShowMessage(List.Text); //aaa//Duplicates 有3个可选值://dupIgnore: 放弃;//dupAccept: 结束;//dupError: 提示错误.List.Free;
end;排序与倒排序 //排序函数
function DescCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
beginResult : -AnsiCompareText(List[Index1], List[Index2]);
end;procedure TForm1.Button1Click(Sender: TObject);
varList: TStringList;
beginList : TStringList.Create;List.Add(bbb);List.Add(ccc);List.Add(aaa); //没有排序ShowMessage(List.Text); //bbb ccc aaa //正排序List.Sort;ShowMessage(List.Text); //aaa bbb ccc//倒排序List.CustomSort(DescCompareStrings); //调用排序函数ShowMessage(List.Text); //ccc bbb aaa//假如List.Sorted : True;List.Add(999);List.Add(000);List.Add(zzz);ShowMessage(List.Text); //000 999 aaa bbb ccc zzz
end;这里List.CustomSort(DescCompareStrings);是自定义排序函数,我们可以自己设计排序函数
列举几个常用的排序规则的示例 升序排序默认规则 function AscendingCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;beginResult : AnsiCompareText(List[Index1], List[Index2]);end;这是默认的升序排序规则。使用 AnsiCompareText 函数比较字符串返回标准的升序排序。 降序排序 function DescendingCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;beginResult : -AnsiCompareText(List[Index1], List[Index2]);end;这是降序排序规则。与升序相比返回值取反实现降序排序。 按字符串长度排序 function LengthCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;beginResult : Length(List[Index1]) - Length(List[Index2]);end;这个规则按字符串长度升序排序。如果你希望降序排序可以取反返回值。 自定义规则示例 function CustomCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
begin// 自定义比较规则根据你的需求实现// 返回负值、零、正值分别表示小于、等于、大于的关系
end;这是一个占位的自定义比较规则你可以在函数体内根据具体需求实现自定义的比较逻辑。
使用这些规则时只需将相应的比较函数传递给 CustomSort 方法例如
MyList.CustomSort(AscendingCompareStrings); // 升序排序
MyList.CustomSort(DescendingCompareStrings); // 降序排序
MyList.CustomSort(LengthCompareStrings); // 按长度排序
MyList.CustomSort(CustomCompareStrings); // 自定义规则我们自己构造一个排序算法比如我们经常会遇到8910这样的数字会被排序成1089。必须要改成080910才可以正常排序非常麻烦。现在自己设计一个排序函数
function NumericSort(List: TStringList; Index1, Index2: Integer): Integer;
varNum1, Num2: Integer;
begin// 将字符串转换为数字Num1 : StrToIntDef(List[Index1], MaxInt);Num2 : StrToIntDef(List[Index2], MaxInt);// 进行数字比较Result : Num1 - Num2;//如果都不是数字安装默认排序法排序if (Num1 MaxInt) and (Num2 MaxInt) thenResult : AnsiCompareText(List[Index1], List[Index2]);
end;终于正常排序了Very good.
现在来讨论它的一些高级的用法。 先看第一个CommaText。怎么用呢用代码说话
constconstr :String aaa,bbb,ccc,ddd;
varstrs :TStrings;i :Integer;
beginstrs : TStringList.Create;strs.CommaText : constr;for i : 0 to Strs.Count-1 doShowMessage(Strs[i]);
end;执行了这段代码后可以看到ShowMessage显示出来的分别是aaa bbb ccc ddd。 也就是说strs.CommaText : constr这一句的作用就是把一个字符串以’,为分割符分段添加到TStrings中。 那么如果不是以, 来分割又该怎么做呢现在看第二个例子。使用Delimiter和DelimitedText。
constconstr :String aaa\bbb\ccc\ddd;
varstrs :TStrings;i :Integer;
beginstrs : TStringList.Create;strs.Delimiter : \;strs.DelimitedText : constr;for i : 0 to Strs.Count-1 doShowMessage(Strs[i]);
end;可以看到 显示的效果和第一个例子是一模一样的。解释一下 Delimiter为分隔符默认为, DelimitedText就是按Delimiter为分隔符的一个串得到赋值后回把这个字符串按Delimiter的字符添加到TStrings中。 说到这里有想起一个属性QuoteChar。其默认值为‘’不包括单引号 有何用呢看例子
constconstr :String aaa\bbb\ccc\ddd;
varstrs :TStrings;i :Integer;
beginstrs : TStringList.Create;strs.Delimiter : \;strs.DelimitedText : constr;for i : 0 to Strs.Count-1 doShowMessage(Strs[i]);
end;显示出来的仍然是aaa bbb ccc ddd。为什么不是“aaa” “bbb” “ccc” ddd呢
再来看一个例子
constconstr :String |aaa|\|bbb|\|ccc|\|ddd|;
varstrs :TStrings;i :Integer;
beginstrs : TStringList.Create;strs.Delimiter : \;strs.QuoteChar : |;strs.DelimitedText : constr;for i : 0 to Strs.Count-1 doShowMessage(Strs[i]);
end;显示出来的又是aaa bbb ccc ddd。对比一下应该不难明白吧QuoteChar 不给他指定的话默认就是 但是还要多说一句当Delimiter为, 而QuoteChar为 时DelimitedText和CommaText是同等的。
这里注意Delimiter是一个Char他只能是一个字符如果要分割 ‘aaa----bbb----ccc----ddd’这样的字符串可以用替换函数StringReplace 把---替换成-在处理。
最后要说的三个是Names Values ValueFromIndex。 看看下面的代码
constconstr :String 0aaa,1bbb,2ccc,3ddd;
varstrs :TStrings;i :Integer;
beginstrs : TStringList.Create;strs.CommaText : constr;for i : 0 to strs.Count-1 dobeginShowMessage(strs.Names);ShowMessage(strs.Values[strs.Names]);ShowMessage(strs.ValueFromIndex);end;
end;通过这个例子不难看出 这个时候strs中的内容是 0aaa 1bbb 2ccc 3ddd
而Names中则是 0 1 2 3
在Values中则是 aaa bbb ccc ddd
下面的代码中空格也会被当做分割符
List.Delimiter : |;
List.DelimitedText : aaa|bb b|ccc|ddd; 我们需要设置强制分隔符
// 将严格按照预先设定的分隔符去分隔字符
List.StrictDelimiter: True;
List.Delimiter : |;
List.DelimitedText : aaa|bb b|ccc|ddd;原文链接https://blog.csdn.net/zisongjia/article/details/53784120(在原文的基础上重新整理修改)