如何从数组中删除空/零元素?

用户名

如何从数组中删除空元素或带有nil指针的元素?通用的解决方案将是受欢迎的。

戴维·赫弗南

您可以这样写:

type
  TArrayHelper = class
    class function RemoveAll<T>(var Values: TArray<T>; const Value: T); static;
  end;

....

function TArrayHelper.RemoveAll<T>(var Values: TArray<T>; const Value: T);
var
  Index, Count: Integer;
  DefaultComparer: IEqualityComparer<T>;
begin
  // obtain an equality comparer for our type T
  DefaultComparer := TEqualityComparer<T>.Default;

  // loop over the the array, only retaining non-matching values
  Count := 0;
  for Index := 0 to high(Values) do begin
    if not DefaultComparer.Equals(Values[Index], Value) then begin
      Values[Count] := Values[Index];
      inc(Count);
    end;
  end;

  // re-size the array
  SetLength(Values, Count);
end;

假设您有一个指针数组:

var
  arr: TArray<Pointer>;

然后,您将删除以下nil元素:

TArrayHelper.RemoveAll<Pointer>(arr, nil);

此代码采用简单的方法,始终使用默认的比较器。对于更复杂的类型,这是不好的。例如,某些记录需要自定义比较器。您需要提供一个比较器来支持它。


上面的实现尽可能简单。在性能方面,在可能找不到匹配值或很少匹配值的常见情况下,这很可能是浪费的。这是因为即使两个索引相同,上述版本也会无条件分配。

相反,如果性能存在问题,则可以通过逐步遍历数组直到第一个匹配项来优化代码。然后才开始移动值。

function TArrayHelper.RemoveAll<T>(var Values: TArray<T>; const Value: T);
var
  Index, Count: Integer;
  DefaultComparer: IEqualityComparer<T>;
begin
  // obtain an equality comparer for our type T
  DefaultComparer := TEqualityComparer<T>.Default;

  // step through the array until we find a match, or reach the end
  Count := 0;
  while (Count<=high(Values)) 
  and not DefaultComparer.Equals(Values[Count], Value) do begin
    inc(Count);
  end;
  // Count is either the index of the first match or one off the end

  // loop over the rest of the array copying non-matching values to the next slot
  for Index := Count to high(Values) do begin
    if not DefaultComparer.Equals(Values[Index], Value) then begin
      Values[Count] := Values[Index];
      inc(Count);
    end;
  end;

  // re-size the array
  SetLength(Values, Count);
end;

如您所见,这很难分析。仅当原始版本是瓶颈时,您才打算这样做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从数组中删除空/零元素?

来自分类Dev

从Ruby中的数组中删除前导零元素

来自分类Dev

查找数组中的非零元素

来自分类Dev

如何在numpy数组中求和连续的非零元素

来自分类Dev

如何在单个循环中将数组中的非零元素移到顶部?

来自分类Dev

如何将python列表或numpy数组中的所有非零元素移到一侧?

来自分类Dev

如何在单个循环中将数组中的非零元素移到顶部?

来自分类Dev

如何删除非零元素小于一的行

来自分类Dev

在F#数组函数中使用区分的并集时如何定义零元素

来自分类Dev

如何查找数组中最后一个非零元素的索引

来自分类Dev

如何计算两个Numpy数组之间匹配的零元素的数量?

来自分类Dev

用数组中的下一个非零元素替换0

来自分类Dev

如何绘制矩阵中非零元素的坐标?

来自分类Dev

如何获取numpy中每一列的非零元素索引?

来自分类Dev

如何在现有数据框中添加零元素的新列?

来自分类Dev

如何从numpy.ndarray中随机选择一些非零元素?

来自分类Dev

如何在Julia中跨行找到最小非零元素的列的索引?

来自分类Dev

如何将非零元素添加到噪声中?

来自分类Dev

python解包零元素

来自分类Dev

在numpy 2D数组中查找与零相邻的非零元素的数量

来自分类Dev

如何将每个numpy列中的所有非零元素分配给大小与列数相同的数组中的值?

来自分类Dev

在Simulink中查找二维数组中第一个非零元素的索引

来自分类Dev

更改列中第一个非零元素上方的数组值

来自分类Dev

查找二维数组中具有一些非零元素的列的索引

来自分类Dev

如何用零随机替换非零元素?

来自分类Dev

mysql单个表组通过删除零元素

来自分类Dev

获取数组中非零元素的左上和右下索引的函数

来自分类Dev

具有 5 个零元素的 init 数组

来自分类Dev

强制数组中非零元素之间的最小间距

Related 相关文章

  1. 1

    如何从数组中删除空/零元素?

  2. 2

    从Ruby中的数组中删除前导零元素

  3. 3

    查找数组中的非零元素

  4. 4

    如何在numpy数组中求和连续的非零元素

  5. 5

    如何在单个循环中将数组中的非零元素移到顶部?

  6. 6

    如何将python列表或numpy数组中的所有非零元素移到一侧?

  7. 7

    如何在单个循环中将数组中的非零元素移到顶部?

  8. 8

    如何删除非零元素小于一的行

  9. 9

    在F#数组函数中使用区分的并集时如何定义零元素

  10. 10

    如何查找数组中最后一个非零元素的索引

  11. 11

    如何计算两个Numpy数组之间匹配的零元素的数量?

  12. 12

    用数组中的下一个非零元素替换0

  13. 13

    如何绘制矩阵中非零元素的坐标?

  14. 14

    如何获取numpy中每一列的非零元素索引?

  15. 15

    如何在现有数据框中添加零元素的新列?

  16. 16

    如何从numpy.ndarray中随机选择一些非零元素?

  17. 17

    如何在Julia中跨行找到最小非零元素的列的索引?

  18. 18

    如何将非零元素添加到噪声中?

  19. 19

    python解包零元素

  20. 20

    在numpy 2D数组中查找与零相邻的非零元素的数量

  21. 21

    如何将每个numpy列中的所有非零元素分配给大小与列数相同的数组中的值?

  22. 22

    在Simulink中查找二维数组中第一个非零元素的索引

  23. 23

    更改列中第一个非零元素上方的数组值

  24. 24

    查找二维数组中具有一些非零元素的列的索引

  25. 25

    如何用零随机替换非零元素?

  26. 26

    mysql单个表组通过删除零元素

  27. 27

    获取数组中非零元素的左上和右下索引的函数

  28. 28

    具有 5 个零元素的 init 数组

  29. 29

    强制数组中非零元素之间的最小间距

热门标签

归档