忽略StringList

时间:2019-05-29 14:59:37

标签: delphi

我想创建一个程序(学习Delphi),该程序需要3个不同的列表(来自TEdit

  1. 姓名列表
  2. 搜索第一个列表时要忽略的名称列表
  3. 搜索第一个列表时要忽略的名称列表

采用3个TEdit并将文本转换为TStringList并分开(到目前为止,我对此还可以)。

我要输出第一个或第二个列表中都不存在的第一个列表的名字(或项目)

procedure TForm1.Button1Click(Sender: TObject);
var
i, j ,k : integer;
begin


  list := TStringList.Create;
  ignoreListFirst := TStringList.Create;
  ignoreListSecond := TStringList.Create;

  list.Delimiter := ',';
  ignoreListFirst.Delimiter := ',';
  ignoreListSecond.Delimiter := ',';

  list.DelimitedText := EditList.Text;
  ignoreListFirst.DelimitedText := EditIgnoreList1.Text;
  ignoreListSecond.DelimitedText := EditIgnoreList2.Text;

  for k := 0 to list.Count - 1 do
  begin
    for i := 0 to ignoreListFirst.Count - 1 do
    begin
      for j := 0 to ignoreListSecond.Count - 1 do
      begin
        if (list[k] <> ignoreListFirst[i]) and (list[k] <> ignoreListSecond[k]) then

        EditResult.Text := list[k];
        break;

      end;
    end;
  end;

  list.Free;
  ignoreListFirst.Free;
  ignoreListSecond.Free;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  EditList.Text := 'Katy,Mary,John,Maggie,Carl';
  EditIgnoreList1.Text := 'Katy,Mary,John';
  EditIgnoreList2.Text := 'John,Carl';
end;

尝试交换循环顺序以查看是否可以查明问题所在。

最后一个循环中的第一个列表没有给我任何错误,并产生了名称“ Katy”,是,是列表中的第一个,但被忽略了。

将第一个列表交换为第一个循环。产生了“玛丽”,我想我会忽略(我想要)凯蒂,但据我所见,不会。”

在此示例中(该示例不起作用),我希望它产生不在两个忽略列表中的“ Maggie”。

非常抱歉,如果我解释错了。学习Delphi。 找出任何错误。

3 个答案:

答案 0 :(得分:0)

在搞弄调试器并遵循给出的建议时,我来到了下面的答案。

procedure TForm1.Button1Click(Sender: TObject);
var
  iList, iListFirst ,iListSecond : integer;
  found : boolean;
begin

  list := TStringList.Create;
  ignoreListFirst := TStringList.Create;
  ignoreListSecond := TStringList.Create;

  list.Delimiter := ',';
  ignoreListFirst.Delimiter := ',';
  ignoreListSecond.Delimiter := ',';

  list.DelimitedText := EditList.Text;
  ignoreListFirst.DelimitedText := EditIgnoreList1.Text;
  ignoreListSecond.DelimitedText := EditIgnoreList2.Text;

  for iList := 0 to list.Count - 1 do
  begin
    for iListFirst := 0 to ignoreListFirst.Count - 1 do
    begin
      found := false;
      if list[iList] = ignoreListFirst[iListFirst] then
      begin
        found := true;
        break
      end;
    end;
    if not found then
    begin
      for iListSecond := 0 to ignoreListSecond.Count - 1 do
      begin
        if list[iList] = ignoreListSecond[iListSecond] then
        begin
          found := true;
          break
        end;
      end;
    end;
    if not found then
    begin
      EditResult.Text := list[iList];
      break
    end;
  end;

  list.Free;
  ignoreListFirst.Free;
  ignoreListSecond.Free;

end;

答案 1 :(得分:0)

基本上,您缺少开头/结尾。

for k := 0 to list.Count - 1 do
begin
 for i := 0 to ignoreListFirst.Count - 1 do
 begin
  for j := 0 to ignoreListSecond.Count - 1 do
  begin
    if (list[k] <> ignoreListFirst[i]) and (list[k] <> ignoreListSecond[k]) then
    Begin // here

      EditResult.Text := list[k];
      break;
    End; // here
  end;
 end;
end;

在旧代码中,循环将始终中断。 当不使用开始/结束时,仅if后面的第一行代码将取决于if条件。 第二行将始终执行。

第二个:中断,仅在最内部的循环处中断。因此,另外两个循环将继续,因此可能会显示另一个名称...

但是,除了使用两个额外的内部循环之外,您还可以检查第一个循环的当前字符串是否存在于其他循环中(请参见TstringList.IndexOf

答案 2 :(得分:0)

我将使用TStrings.IndexOf函数执行以下操作。

注意:请记住,请在try-finally block中释放列表,否则迟早会生成memory leaks

var
  List : TStrings;
  IgnoreListFirst : TStrings;
  IgnoreListSecond : TStrings;
  i : integer;
begin
  List := TStringList.Create;
  IgnoreListFirst := TStringList.Create;
  IgnoreListSecond := TStringList.Create;
  try
    List.Delimiter := ',';
    IgnoreListFirst.Delimiter := ',';
    IgnoreListSecond.Delimiter := ',';

    List.DelimitedText := EditList.Text;
    IgnoreListFirst.DelimitedText := EditIgnoreList1.Text;
    IgnoreListSecond.DelimitedText := EditIgnoreList2.Text;

    for i := 0 to List.Count do
    begin
      if(IgnoreListFirst.IndexOf(List[i]) = -1) and (IgnoreListSecond.IndexOf(List[i]) = -1) then
      begin
        EditResult.Text := List[i];
        Exit;
      end;
    end;

  finally
    IgnoreListSecond.Free;
    IgnoreListFirst.Free;
    List.Free;
  end;
end;