我有一个包含10,000个条目的字符串列表.我有一个shuffle例程,但访问任何项目需要花费很多时间.浏览所有10k项目需要花费大量时间.
我想保存它做磁盘然后使用另一种方法对文件进行洗牌.
有什么建议?
我只是好奇,因为我最近看到在Java中使用Hashmaps,并想知道Delphi的Sorted String列表是否相似.
TStringList对象是否生成Hash以用作每个项的索引?如何通过Find函数根据字符串列表检查搜索字符串?
我经常使用Sorted TStringLists,我只想了解更多内容.
请假设我不知道哈希映射是如何工作的,因为我没有:)
谢谢
我正在做一个简单的StringList.sort,但是Delphi使用的QuickTort不是一个稳定的排序,这意味着它可能会改变具有相同键的记录的相对顺序.
我需要使用稳定的排序.对我来说,实现这个最简单的方法是什么?
Mike W的答案可能是最简单的方法,无需进行太多的代码更改.
谢谢,迈克.
我经常发现自己处于调试字符串列表中正在发生的事情的情况,例如,数据正在StringList [StartOfBlock]到StringList [EndOfBlock]的范围内被操纵.我可以快速检查或观察该范围内的一个或多个变量索引,例如StringList [LineNum],但检查StartBlock/Endblock范围内的相邻字符串很麻烦.我可以在StringList [LineNum + 1]上添加另一个监视,或者在Ctrl-F7检查器中修改表达式,但这是非常多的工作;-(
我希望永久性地在IDE中的StringList [StartOfBlock]到StringList [EndOfBlock].(如果在StartOfBlock/EndOfBlock发生更改时该视图发生更改,或者该视图可以刷新,那将是非常好的.)
我将如何在IDE中构建一些东西来实现这一目标?
我一直在寻找如何做到这一点的日子,没有什么是我需要做的(或者我只是不明白如何实现解决方案).
我需要做的是将一个字符串(一个街道地址)解析成TStringList,然后将这些字符串从列表中设置为变量然后传递给程序的其余部分.我已经把列表运行正常了:
var
AddressList : TStringList;
i : integer;
begin
AddressList := TStringList.Create;
AddressList.Delimiter := ' ';
AddressList.DelimitedText := RawAddressStr; //RawAddressStr is parsed from another file and the string result is something like '1234 Dark Souls Lane Wyoming, MI 48419'
for i := 0 to AddressList.Count-1 do
AddressList.Strings[i]; //Not sure what to do here
Run Code Online (Sandbox Code Playgroud)
问题是地址长度不一样.地址有时候会像'1234 Dark Souls Two Lane Wyoming ......'或'1234 Dark Lane Wyoming ......'
所以我需要能够使用这个TStringList将Zip,State和City设置为变量供以后使用.我会使用TStringList.Find,但邮政编码并不总是相同.有没有办法获得最后一个字符串,然后从那里后退?(向后退,因为一旦我获得City,状态ZIP我可以从RawAddressStr中删除它,然后将其余部分设置为地址字符串.)
谢谢.
编辑,这是我需要的代码(感谢下面的评论):AddressList:= TStringList.Create;
AddressList.Delimiter := ' ';
AddressList.DelimitedText := RawAddressStr;
for i := 0 …Run Code Online (Sandbox Code Playgroud) 我正在运行Delphi RAD Studio XE2.
我有一些非常大的文件,每个文件都包含大量的行.线条本身很小 - 只有3个标签分隔的双打.我想将文件加载到TStringList使用中,TStringList.LoadFromFile但这会引发大文件的异常.
对于200万行(约1GB)的文件,我得到了EIntOverflow例外.对于较大的文件(例如,2000万行和大约10GB),我得到了ERangeCheck例外.
我有32GB的RAM可供使用,我只是想加载这个文件并快速使用它.这里发生了什么,我有什么其他选择?我可以使用带有大缓冲区的文件流将此文件加载到TStringList中吗?如果是这样,请举一个例子.
我有一个 Tstringlist,其中包含数据库表中使用的键列表。我想要一种简单的方法来生成一个包含所有键的字符串,每个键用逗号分隔并用单引号引起来。这样它就可以在 SQL 'IN' 语句中使用,例如WHERE FieldX IN ('One','Two','Three')。
我尝试过使用 quotechar 但在读取逗号文本时它会被忽略。例如下面的代码
procedure junk;
var
SL : Tstringlist;
s : string;
begin
SL := Tstringlist.Create;
SL.Delimiter :=','; //comma delimiter
SL.QuoteChar := ''''; //single quote around strings
SL.Add('One');
SL.Add('Two');
SL.Add('Three');
try
s := SL.commatext;
showmessage(s);
finally
SL.Free;
end; //finally
end; //junk
Run Code Online (Sandbox Code Playgroud)
显示消息一、二、三 - 不带任何引号。
我知道我可以从长远来看,就像
procedure junk;
var
SL : Tstringlist;
s : string;
i : integer;
begin
SL := Tstringlist.Create;
SL.Delimiter :=','; //comma delimiter
SL.Add('One');
SL.Add('Two');
SL.Add('Three'); …Run Code Online (Sandbox Code Playgroud) 没有任何形式的同步从TStringList读取数据是否可以?例如,与主线程同步.
示例代码
var MyStringList:TStringList; //declared globally
procedure TForm1.JvThread1Execute(Sender: TObject; Params: Pointer);
var x:integer;
begin
for x:=0 to MaxInt do MyStringList.Add(FloatToStr(Random));
end;
procedure TForm1.ButtonClick(Sender: TObject);
var x:integer;
SumOfRandomNumbers:double;
begin
for x:=0 to MyStringList.Count-1 do
SumOfRandomNumbers:=SumOfRandomNumbers+StrToFloat(MyStringList.Strings[x]);
end;
Run Code Online (Sandbox Code Playgroud)
或者我应该使用EnterCiticalSection保护对MyStringList的访问
var MyStringList:TStringList; //declared globally
procedure TForm1.JvThread1Execute(Sender: TObject; Params: Pointer);
var x:integer;
begin
for x:=0 to MaxInt do
begin
EnterCriticalSection(MySemaphore);
MyStringList.Add(FloatToStr(Random));
LeaveCriticalSection(MySemaphore);
end;
end;
procedure TForm1.ButtonClick(Sender: TObject);
var x:integer;
SumOfRandomNumbers:double;
begin
for x:=0 to MyStringList.Count-1 do
begin
EnterCriticalSection(MySemaphore);
SumOfRandomNumbers:=SumOfRandomNumbers+StrToFloat(MyStringList.Strings[x]);
LeaveCriticalSection(MySemaphore);
end;
end;
Run Code Online (Sandbox Code Playgroud) 我正在使用此代码来检查是否TStringList创建:
procedure TForm1.Button1Click(Sender: TObject);
var
sVariable : TStringList;
begin
if not Assigned(sVariable) then
sVariable:= TStringList.Create;
end;
Run Code Online (Sandbox Code Playgroud)
但条件False总是如此,为什么会发生这种情况?如何检查TStringList对象是否已创建?
Ps我知道有一个类似的问题问题,我试过在那个问题上发布的解决方案,但它对我不起作用.
好的,我一直试图找出我正在制造的每一个可能的错误,但我放弃......我需要帮助!我正在写的是一个应用程序来管理我的工作租金,当日期过去时,我的应用程序从2个文本文件中删除名称.我编写了3个小函数(程序)来完成这项工作.这里:
这个从dates.dat文件加载并删除包含该员工姓名的行.
procedure remDate(emp: String);/// Removes employee from date file
var
pos1, i: integer;
dateList: TStringList;
begin
dateList:=TStringList.Create;
dateList.LoadFromFile('Data\dates.dat');
for i:=0 to dateList.Count-1 do begin
pos1:=AnsiPos(emp, dateList[i]);
if pos1<>0 then begin
dateList.Delete(i);
dateList.SaveToFile('Data\dates.dat');
end;
end;
dateList.Free;
end; //eo remDate
Run Code Online (Sandbox Code Playgroud)
这个从perm.dat文件中删除包含员工姓名的行.
procedure remPerm(emp: String);/// Removes employee from perm file
var
pos1, i: integer;
permList: TStringList;
begin
permList:=TStringList.Create;
permList.LoadFromFile('Data\perm.dat');
for i:=0 to permList.Count-1 do begin
pos1:=AnsiPos(emp, permList[i]);
if pos1<>0 then begin
permList.Delete(i);
permList.SaveToFile('Data\perm.dat');
end;
end;
permList.Free;
end; //eo remPerm
Run Code Online (Sandbox Code Playgroud)
这个把它们粘在一起.isDue是一个简单的函数,它比较2个日期,如果日期是今天或过去,则返回TRUE.
procedure updatePerms; …Run Code Online (Sandbox Code Playgroud) delphi ×10
tstringlist ×10
csv ×1
delphi-7 ×1
delphi-xe2 ×1
filestream ×1
for-loop ×1
performance ×1
range ×1
readfile ×1
sorting ×1
stable-sort ×1
string ×1
text-files ×1