- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 TList 和 BinarySearch 时遇到一些问题。我有这样的结构:
PDoubleEstr = record
Double: array [1..2] of Integer;
Count: Integer;
end;
TDoubleEstr = TList<PDoubleEstr>;
并声明:
var oDoubleEstr: TDoubleEstr;
然后,我使用此函数正确初始化列表:
procedure Initialize;
var
iIndex1, iIndex2: Integer;
rDoubleEstr: PDoubleEstr;
begin
oDoubleEstr.Clear;
for iIndex1 := 1 to 89 do
for iIndex2 := Succ(iIndex1) to 90 do
begin
with rDoubleEstr do
begin
Double[1] := iIndex1;
Double[2] := iIndex2;
Count := 0;
end;
oDoubleEstr.Add(rDoubleEstr);
end;
end;
现在,我定义这个过程:
procedure Element(const First: Integer; const Second: Integer; var Value: PDoubleEstr);
begin
with Value do
begin
Double[1] := First;
Double[2] := Second;
end;
end;
然后在我的主要程序中:
procedure Main;
var
Value: PDoubleEstr;
Index: Integer;
flag: boolean;
begin
Element(89, 90, Value);
flag := oDoubleEstr.BinarySearch(Value, Index, TDelegatedComparer<PDoubleEstr>.Construct(Compare));
Writeln(Flag:5, oDoubleEstr[Index].Double[1]:5, oDoubleEstr[Index].Double[2]:5);
end;
这让我犯了一个错误。从某种意义上说,索引为“Index”的元素与我输入的元素不对应。当然,oDoubleEstr 排序正确,但不明白我错在哪里。构造 Compare 的定义如下:
function TDouble.Compare(const Left, Right: PDoubleEstr): Integer;
begin
Result := Sign(Left.Double[1] - Right.Double[2]);
end;
我认为错误是在构造中,但不理解为解决它。一般来说,我想检查元素是否存在,如果存在则获取索引。作为元素,我的意思是在我的例子中只有字段 Double 。我尝试更好地解释,我的列表是如此丰富:
1 2 // element 0
1 3
......
1 90
......
88 89
88 90
89 90 // element 4004
如果我将 Element 设置为 (89,90),它应该将我作为索引值:4004,如果找到它,则为 true,否则为 false。感谢您的帮助。
最佳答案
我不确定你想做什么,但是 Compare
功能无效。比较函数需要具有以下对称性:
Compare(a, b) = -Compare(b, a)
您的函数没有此属性,因为您比较 Double[1]
与 Double[2]
.
比较函数中的减法还存在出现范围错误的风险。我会使用 <
和>
改为运营商。
我有点不愿意建议比较函数应该是什么,因为我不确定您想要的排序标准是什么。如果您想要字典顺序比较(即字母顺序),则比较 Double[1]
首先比较值,如果它们比较相等,则执行 Double[2]
的第二次比较值。
但是,既然我再次查看了构建列表的方式,并且现在我看到您断言此列表在构建时已排序,那么顺序函数应该是什么就很清楚了。像这样的事情:
function CompareInt(const Left, Right: Integer): Integer;
begin
if Left<Right then begin
Result := -1
else if Left>Right then
Result := 1
else
Result := 0;
end;
function Compare(const Left, Right: PDoubleEstr): Integer;
begin
Result := CompareInt(Left.Double[1], Right.Double[1]);
if Result=0 then
Result := CompareInt(Left.Double[2], Right.Double[2]);
end;
请注意,我已经从您的原始版本(尽管有缺陷)中反转了比较函数的符号。您的次要问题(请参阅对 Ville 答案的评论)是因为列表没有按照您用于搜索的相同顺序进行排序。您必须使用相同的比较进行排序和搜索。二分查找算法就是以此为基础的。
<小时/>顺便说一句,我认为 Double
是一个糟糕的变量名,因为它也是一个基本类型。使用PDoubleEstr
命名一条记录非常令人困惑,因为常规用法为 P
前缀用于指针。
关于delphi - TList 和 BinarySearch 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287393/
假设我有多个对象存储在 TO1:TList 中,然后我创建多个 TO1 并将它们全部放在 TO2:TList 中。如何在 TO2 中的选定 TO1 中获取选定对象的值? 最佳答案 由于TList为您提
我想知道是否有任何安全的方法可以将 TList 元素复制到任何其他 TList 中特定的位置和特定的长度。我应该将 list1 的元素分配给 list2 还是有没有我不知道的功能可以更准确地处理? 感
我有一个 TList 类型的列表.我需要将其转换为 TList像这样: procedure mainForm.testCast; var listT: TList; listW: TList;
我有一个 TList。它包含相同类型的对象的集合。这些对象是 TPersistent 的后代,并且具有大约 50 个不同的已发布属性。 在我的应用程序中,用户可以对这些对象进行搜索,搜索结果显示在 T
我有一个智能指针的实现,并且我尝试在通用 TList 上实现它。 program Project2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUt
我想声明一个通用记录类型,例如 TMyGenericRecord = record X: ; Y: ; end; 然后我想声明一个 TMyGenericRecord 的 TList,但似乎
我想在 Delphi XE5 中使用带有子列表的通用记录 TList: type TMyRecord=record Value1: Real; SubList: TList;
我在使用 TList 时遇到内存泄漏问题。我正在尝试通过填充的列表填充 Tlist 循环并使用数据。下面的代码只是填充列表的代码,而不是使用它。 private { Private Form Va
我有一个包含以下声明的 Delphi 移动应用程序: TWJInformationList = class(TList) 当我为任何移动设备(Android、iOS 设备 32 位、iOS 设备 64
我正在使用 Generics.Collections.TList 和 Sort 方法。它工作正常,但我想最后对空值或空值进行排序。按升序和降序排序。如何实现? 这是我的排序函数: function T
我的项目(在 Delphi 6 上运行!)需要一个内存分配列表(TMemoryAllocation),我将其存储在一个对象中,该对象还保存有关分配大小(FSize)以及分配是否正在使用或空闲(FUse
我正在尝试统计每个 ProductCode 在我的数据库中使用的次数。问题是,我不知道所有代码是什么(或者可能会添加更多代码)。 我假设我可以使用带有值对(productCode 和 count)的
代码大致如下所示,它会为创建的每个 TMyRecord 中的每个字符串实例泄漏内存。我想我必须访问每条记录并以某种方式释放它——这可以在不清除每个单独字符串的情况下完成吗? function TMyF
使用TList作为记录容器。在应用过程中,TList添加和删除大量记录。但在delete之后,属性capacity永远不会减少,内存也不会被释放。怎么解决这个问题呢?简单的代码示例: type T
我正在尝试了解 Delphi 中的泛型,但 TList 有一个非常基本的问题。 我已经成功创建了一个整数列表并用 1000 个奇数填充它。我想将列表中所有能被 3 整除的数字更改为 0。我想我可以做这
有人可以向我解释一下这是否可能吗,或者我完全误解了这个 Delphi 功能。 假设我有一个类,我创建了其中一些类,然后将它们添加到 ObjectList 中。通常我这样做: Type TMyClass
我创建了一个简单的类,将对象保存在通用列表中。我设法让它工作。但我不明白为什么这不起作用。 for Monster in MonsterList do begin Monster.
我在 Windows 10 中使用 Delphi 10.1 Berlin。 我有两条不同大小的记录。我编写了循环遍历两个 TList 的代码这些记录来测试耗时。循环遍历较大记录的列表运行速度要慢得多。
我在 Delphi 4 中有这段代码。我创建了 10 个 T_Charge 类型的对象(见下文),并将其添加到 TList 中,名为 myList。 T_Charge 类型引用了三个 T_Platte
关于通用TList的一切。我有这样的结构: Type TExtract = record Wheel: string; Extract: array [1..5] of Byte;
我是一名优秀的程序员,十分优秀!