我有一个很大的字符串列表,它是一个TStringList,按键排序。结构是(' Key',Obj)。 在此列表中,有单个和重复的键值。我试图将它们分成两个单独的列表,一个用于单个值,另一个用于重复列表。
如果我的初始列表是{A,A,A,B,B,C,D,E,E,F},那么结果应该是单个列表= {C,D,F}和列表重复= {A,B,E}。
我尝试了相同代码的许多不同变体来尝试让它发挥作用,但我遇到了很多问题。 :)
我得到键[i]和键[i + 1]并比较它们,如果它们相同,我将[i + 1]保存到临时字符串中并设置一个bool值,I然后运行一些条件检查来确定它应该进入哪个列表,但此刻只是失败。
看起来这应该是一件容易的事情,我有点不好意思。非常感谢任何帮助,谢谢。
答案 0 :(得分:4)
StartIndex := 0;
for i := 1 to List.Count - 1 do
if List[i].Key <> List[StartIndex].Key then begin
if i - StartIndex = 1 then
SingleList.Add(List[StartIndex])
else
MultiList.Add(List[StartIndex])
StartIndex := i;
end;
//check for the last chunk
if StartIndex = List.Count - 1 then
SingleList.Add(List[StartIndex])
else
MultiList.Add(List[StartIndex])
答案 1 :(得分:1)
我怀疑你犯的错误是在key[i] = key[i+1]
的情况下你没有为下一次比较选择正确的索引。因此,如果输入为A,A,A,B,B
,您首先要比较i := 0 => [0]=[1]
(您比较前两个A
),这是真的。然后,您可以继续使用i := 2
,这意味着您将最后A
与导致该错误的第一个B
进行比较。解决方案是在最后一个键等于当前匹配键之后将索引移动到下一个值,即类似
while(list.Count > i)and(list.keys[i] = currentKey)do Inc(i);
在适当的地方应确保您使用正确的列表项进行下一个关键比较。