Salesforce Apex:对地图进行排序

Salesforce Apex:对地图进行排序,salesforce,apex-code,apex,Salesforce,Apex Code,Apex,我有一个Sobject类型的映射作为键,Integer类型的映射作为值。Sobject的字段类型为Text,其他字段类型为date,另一字段类型为Number(16,2)。当我将数据放入映射并调试它时,映射会以排序方式返回数据。地图根据键中的数字字段(即对象的数字数据字段)对其进行排序。我可以按对象的日期字段(该字段是其键)对地图进行排序吗?下面是我的地图的大致结构和关键对象字段 Map<Effort_Allocation__c, Double> cellContent; Eff

我有一个Sobject类型的映射作为键,Integer类型的映射作为值。Sobject的字段类型为Text,其他字段类型为date,另一字段类型为Number(16,2)。当我将数据放入映射并调试它时,映射会以排序方式返回数据。地图根据键中的数字字段(即对象的数字数据字段)对其进行排序。我可以按对象的日期字段(该字段是其键)对地图进行排序吗?下面是我的地图的大致结构和关键对象字段

 Map<Effort_Allocation__c, Double> cellContent;
 Effort_Allocation__c.Allocated_Effort_Hours__c; //The Number field by which the map gets sorted
 Effort_Allocation__c.Assignment_Date__c; // The date field by which I want the map to get sorted
地图内容;
工作分配。分配的工作时间//用于对贴图进行排序的数字字段
工作分配分配分配日期我希望地图按其排序的日期字段

使用对象作为贴图的键是个坏主意。相反,您应该使用对象的ID作为键。对此原因进行了详细讨论。短版本-对象的值可能会更改,从而更改对象的哈希值并破坏地图

虽然不能直接对地图进行排序,但可以对列表进行排序,因此可以使用列表按排序顺序访问地图元素。您需要为实现“Comparable”接口的对象创建一个包装器类。有一个例子。请注意,该示例按日期排序

该类声明为“可比较”

并与以下方法进行了比较

global Integer compareTo(Object compareTo) {

// Cast argument to AccountHistoryWrapper
AccountHistoryWrapper aHW = (AccountHistoryWrapper)compareTo;

// The return value of 0 indicates that both elements are equal.
Integer returnValue = 0;

if ( aHW.account.CreatedDate > aHW.account.CreatedDate) {
// Set return value to a positive value.
returnValue = 1;
} else if ( aHW.account.CreatedDate < aHW.account.CreatedDate) {
// Set return value to a negative value.
returnValue = -1;
}

return returnValue;
}
全局整数比较对象(对象比较对象){
//将参数强制转换为AccountHistoryWrapper
AccountHistoryWrapper aHW=(AccountHistoryWrapper)compareTo;
//返回值0表示两个元素相等。
整数值=0;
如果(aHW.account.CreatedDate>aHW.account.CreatedDate){
//将返回值设置为正值。
返回值=1;
}else if(aHW.account.CreatedDate
文本排序如何?对于测试排序,需要更改“compareTo”方法。
global Integer compareTo(Object compareTo) {

// Cast argument to AccountHistoryWrapper
AccountHistoryWrapper aHW = (AccountHistoryWrapper)compareTo;

// The return value of 0 indicates that both elements are equal.
Integer returnValue = 0;

if ( aHW.account.CreatedDate > aHW.account.CreatedDate) {
// Set return value to a positive value.
returnValue = 1;
} else if ( aHW.account.CreatedDate < aHW.account.CreatedDate) {
// Set return value to a negative value.
returnValue = -1;
}

return returnValue;
}