有没有办法找到指针数组的索引?

时间:2014-10-14 20:42:49

标签: arrays delphi delphi-2009

有没有办法找到指针数组的索引?

代码是这样的:

type

  TArrayItem = record
   Field1: string;
   Field2: integer;
   Field3: boolean;
  end;

var 
  MyItem: TArrayItem; 
  MyArray: array[1..100] of TArrayItem;

我们说我从数组中取一个项目(MyItem:=MyArray[20];)。在此之后,我对数组进行排序,并更改项目位置;现在,我如何找到MyItem的新索引?

2 个答案:

答案 0 :(得分:4)

您没有指针数组。与class(参考类型)不同,record是值类型。声明数组的方式,只要进行赋值,就会复制项目数据。所以,如果您将一个数组项目分配给MyItem,那么您正在对该项目的数据进行复制,而您没有获得指向原始项目的指针。

在任何情况下,无论你有一个项目数组还是指向项目的指针数组,答案都是一样的:在数组中查找项目的唯一方法是手动遍历数组,例如:

var 
  MyItem: TArrayItem; 
  MyArray: array[1..100] of TArrayItem;
  I: Integer;

MyItem := MyArray[20];

// sort the array...

for I := Low(MyArray) to High(MyArray) do
begin
  if (MyArray[I].Field1 = MyItem.Field1) and
     (MyArray[I].Field2 = MyItem.Field2) and
     (MyArray[I].Field3 = MyItem.Field3) then
  begin
    // item was found at index I...
  end;
end;

否则,动态分配您的项目并将其指针存储在TListTList<T>中,因为它们会公开IndexOf()方法。排序会更快,因为你只是移动指针,而不是完整的数据副本。

答案 1 :(得分:4)

没有内在的机制来做你所要求的。您将不得不迭代数组并识别匹配项,以便识别它在该数组中的位置。

在这种情况下,您还应该注意,虽然您的问题表明您有一个“指针数组”,但您发布的代码是不是一个指针数组,而是一个数组记录,它们是值类型而不是引用,所以此代码:

MyItem := MyArray[20];

未获取对 MyArray 中第20项的引用,而是创建了它的副本。当您查找项目的副本与项目的引用时,用于标识数组中项目的代码变化非常明显。

要查找指针数组中的项目:

var
   i, indexOfItem: Integer;
   item: ^TArrayItem;
   theArray: array[1..100] of ^TArrayItem;


item := theArray[20];

indexOfItem := -1;
for i := Low(theArray) to High(theArray) do
  if (theArray[i] = item) then
  begin
    indexOfItem := i;
    BREAK;
  end;

要查找记录数组中的项目,您必须分别测试记录字段的相等性,因为您无法将两个记录作为一个整体进行比较:

var
   i, indexOfItem: Integer;
   item: TArrayItem;
   theArray: array[1..100] of TArrayItem;


item := theArray[20];

indexOfItem := -1;
for i := Low(theArray) to High(theArray) do
  if   (theArray[i].Field1 = item.Field1) 
   and (theArray[i].Field2 = item.Field2) 
   and (theArray[i].Field3 = item.Field3) then
  begin
    indexOfItem := i;
    BREAK;
  end;

您还应该知道,在后一种情况下,内置假设没有两个项目对记录字段具有相同的值,因为只会识别第一个匹配的项目。

NB。 上述代码并不是强大的解决方案,只是为了展示所涉及的原则

最后要注意的是,在排序数组之前,您可能有一个记录数组,但已经获得了指针到该数组中的某个项目:

var
   item: ^TArrayItem;
   theArray: array[1..100] of TArrayItem;


item := @theArray[20];
SortTheArray(theArray);

如果是这种情况,那么在对数组进行排序(或对该数组进行任何形式的操作)之后,指针的值可能根本不再可靠对于动态数组,因为数组可能已经在内存中移动了![/ p>

即使数组没有移动,就像当前静态数组的情况一样,项目指针将指向该数组中第20个位置现在的任何项目,而不是那个项目 在排序之前的那个位置。