【问题标题】:Sorting TDictionary排序字典
【发布时间】:2012-06-16 06:59:33
【问题描述】:

我对通用集合没有经验。我需要对 TDictionary 进行排序。

type TSearchResult = TPair<Integer,double>;

var
   target_results : TDictionary<Integer, double>;
   session_search_results : array[0..max_searches] of TArray<TSearchResult>;

我正在使用此代码进行排序

   session_search_results[session_search_id]:= target_results.ToArray;
   TArray.Sort<TSearchResult>(session_search_results[session_search_id],
                    TComparer<TSearchResult>.Construct(
                              function(const L, R: TSearchResult): Integer
                              begin
                                 Result := Round(R.Value - L.Value);
                              end
                    ));

为什么会出现访问冲突?我做错了什么?

补充:

如果我用

遍历数组
 for i:= 0 to Length(session_search_results[session_search_id])-1 do
      MyDebug(IntToStr(session_search_results[session_search_id][i].Key)+' = value = '
            + FloatToStr(session_search_results[session_search_id][i].Value));

我得到以下输出:

Debug Output: ==>CoreSearchText: array length=8<== Process TestApp.exe (2536)
Debug Output: ==>100007 = value = 19,515<== Process TestApp.exe (2536)
Debug Output: ==>100003 = value = 2,4<== Process TestApp.exe (2536)
Debug Output: ==>100005 = value = 12<== Process TestApp.exe (2536)
Debug Output: ==>100008 = value = 2,4<== Process TestApp.exe (2536)
Debug Output: ==>100002 = value = 2,4<== Process TestApp.exe (2536)
Debug Output: ==>100004 = value = 2,4<== Process TestApp.exe (2536)
Debug Output: ==>100009 = value = 40,515<== Process TestApp.exe (2536)
Debug Output: ==>100001 = value = 15<== Process TestApp.exe (2536)

应用排序后,访问冲突会使应用程序崩溃。阵列似乎没问题。可能是什么原因?谢谢!

【问题讨论】:

  • session_search_idcore_session_search_count 是否都指向一个有效的数组索引?
  • 抱歉,我已经更正了。如果我不应用排序,则数组显示正确的内容。
  • 您没有对字典进行排序(根据定义未排序),但您正在对数组进行排序。您显示的代码是正确的,请显示TSearchResult的定义以及您填写字典的部分。你确定那里没有nil 指针吗?
  • type TSearchResult = TPair;我会仔细检查是否有可能在那里获得 nil 指针。当我迭代并显示数组的内容(排序前)时,它显示正常。如果那里有一个零,我应该得到一个错误?这是对字典进行排序的最佳方法。
  • 为什么要在比较函数中舍入R.Value - L.Value?您是否正在处理可能与 &lt;= 0.5 不同的值。如果是这样,则您的比较函数不一致,因为 1.1 似乎等于 1.5,而 1.5 似乎等于 1.9,但 1.9 的计算结果大于 1.1

标签: delphi generics sorting dictionary delphi-xe


【解决方案1】:

这似乎是 XE 中的一个代码生成错误(也存在于 XE2 中),重新声明了通用记录并开启了优化。

这个程序重现了这个错误:

program Project1;

{$APPTYPE CONSOLE}
{$O+}

uses
  Generics.Collections,
  Generics.Defaults,
  SysUtils;

type
  TSearchResult = TPair<Integer, Integer>;

function Compare(const L, R: TSearchResult): Integer;
begin
  Result := R.Value - L.Value;
end;

var
  values: TArray<TSearchResult>;
begin
  try
    SetLength(values, 3);
    TArray.Sort<TSearchResult>(values, TComparer<TSearchResult>.Construct(Compare));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

我已将其报告为QC #106391

一种可能的解决方案是将 {$O-} 添加到包含对 TArray.Sort 的调用的单元中。

【讨论】:

  • 我已经添加了编译器指令并且它已经解决了。谢谢您的帮助。我希望这将为其他开发人员节省时间。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2013-05-01
  • 2010-12-23
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多