将字符串列表拆分为2个列表,其中一个包含单个值和其他倍数

时间:2014-12-12 10:44:18

标签: list delphi loops iteration

我有一个很大的字符串列表,它是一个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然后运行一些条件检查来确定它应该进入哪个列表,但此刻只是失败。

看起来这应该是一件容易的事情,我有点不好意思。非常感谢任何帮助,谢谢。

2 个答案:

答案 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);

在适当的地方应确保您使用正确的列表项进行下一个关键比较。