Скопировать список из списка - PullRequest
0 голосов
/ 18 февраля 2012

у меня есть полный код:

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 Ответ

2 голосов
/ 18 февраля 2012

Вы создаете новый экземпляр 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;
...