【问题标题】:Copy sublist from list从列表中复制子列表
【发布时间】:2012-02-18 01:43:17
【问题描述】:

我有这个完整的代码:

program List;

{$APPTYPE CONSOLE}

{$R *.res}

uses  System.SysUtils,   
      Generics.Collections;

type   
  TMySubList = TList<Integer>;   
  TMyList = TObjectList<TMySubList>; 

var   
  iIndex1, iIndex2: Integer;   
  MyList: TMyList;   
  MySubList: TMySubList; 

begin

 try
    { TODO -oUser -cConsole Main : Insert code here }

    MyList := TMyList.Create;
    try

      for iIndex1 := 1 to 10 do
      begin
        MySubList := TList<Integer>.Create;
        if MyList.Count <> 0 then MySubList :=  MyList.Last;
        MySubList.Add(iIndex1);
        MyList.Add(MySubList);
      end;

      for iIndex1 := 0 to pred(MyList.Count) do
      begin
        for iIndex2 := 0 to pred(MyList[iIndex1].Count) do write(MyList[iIndex1][iindex2]:5);
        writeln;
      end;

    finally
      MyList.Free;
    end;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);   
  end;

  Readln;

end.

作为输出我应该有一些东西:

 1                                   // MyList[0]
 1  2                                // MyList[1]
 1  2  3                             // MyList[2]
 1  2  3  4                          // MyList[3]
 1  2  3  4  5                       // MyList[4]
 1  2  3  4  5  6                    // MyList[5]
 1  2  3  4  5  6  7                 // MyList[6]
 1  2  3  4  5  6  7  8              // MyList[7]
 1  2  3  4  5  6  7  8  9           // MyList[8]
 1  2  3  4  5  6  7  8  9  10       // MyList[9]

但我有这个结果:

 1  2  3  4  5  6  7  8  9  10       // MyList[0]
 1  2  3  4  5  6  7  8  9  10       // MyList[1]
 1  2  3  4  5  6  7  8  9  10       // MyList[2]
 1  2  3  4  5  6  7  8  9  10       // MyList[3]
 1  2  3  4  5  6  7  8  9  10       // MyList[4]
 1  2  3  4  5  6  7  8  9  10       // MyList[5]
 1  2  3  4  5  6  7  8  9  10       // MyList[6]
 1  2  3  4  5  6  7  8  9  10       // MyList[7]
 1  2  3  4  5  6  7  8  9  10       // MyList[8]
 1  2  3  4  5  6  7  8  9  10       // MyList[9]

以这个错误结束:EInvalidPointer:无效的指针操作。 代码很简单,但不明白我在哪里出错,或者我忘记添加什么,以获得我想要的输出。 再次感谢谁帮我解决了这个问题,非常感谢

【问题讨论】:

  • -1 为什么 Codez 不起作用问题。

标签: delphi delphi-xe2


【解决方案1】:

您正在创建一个 MySubList 的新实例,然后几乎总是用指向现有列表的指针覆盖它,然后向其中添加新项目。相反,您需要将前一个列表中的项目单独复制到新列表中:

  for iIndex1 := 1 to 10 do
  begin
    MySubList := TList<Integer>.Create;
    if MyList.Count <> 0 then begin
      for iIndex2 := 0 to MyList.Last.Count-1 do
        MySubList.Add(MyList.Last[iIndex2]);
    end;
    MySubList.Add(iIndex1);
    MyList.Add(MySubList);
  end;

【讨论】:

  • 你好,谢谢,这解决了问题,但是速度很慢:(举个例子,如果 iindex1 需要计数到 9000 并且子列表有 90 个元素,则需要 15 秒或更多。一般来说,我需要处理数千个元素的子列表,所以时间非常紧迫,只是想知道我可以解决这个问题吗?再次感谢。
  • Marcello.... 我觉得你的问题类型令人沮丧。这就像有人发明了一辆汽车,然后问一个机械师为什么它不能运行。是你的车。你写了每一行。在调试器中单步执行并了解当前代码的作用,或者,如果它没有执行您想要的操作,请重新开始,并逐行执行,直到它执行您想要的操作。询问为什么有缺陷的大块代码不能满足您的要求,就是要求我们做一个基本的行为——精确而仔细地思考,这就是软件开发的全部意义
  • 你好沃伦,我真的很理解你。真诚地,我考虑过使用动态数组和列出两者来解决它,我也可以在不从列表中复制单个元素的情况下进行复制。所以我检查了这比以前要快得多。缓慢是由于从列表或其他列表中复制单个元素引起的。只是我想知道是否有更好的解决方案。对我来说,使用数组当然不是问题,只是想尝试找到更灵活和快速的解决方案。非常感谢您的帮助。该解决方案部分解决了问题,但从中我学到了新东西,这对我也有很大帮助。 :)
  • @David:注意MyListTObjectList,所以子列表不会泄露。
  • @Smasher:仅当 OwnsObjects 设置为 true 时,但在这种情况下,即使这样也无济于事,因为列表元素会不断地被相同列表的代码覆盖。当从 tObjectList 中删除项目时,OwnsObjects 开始发挥作用,这通常发生在列表本身被释放并因此首先被清除时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2021-05-27
  • 2018-02-17
  • 2018-04-22
  • 2019-10-31
相关资源
最近更新 更多