ColdFusion中整数的TreeMap

时间:2014-01-23 19:15:33

标签: coldfusion treemap

我需要在ColdFusion中有效地搜索整数范围。这些范围有不同的长度,它们可以有“洞”(它们不连续)。

我认为从ColdFusion调用的Java TreeMap将是一种有效的解决方案。但是,我遗憾地发现TreeMap按字母顺序排列,我需要数字顺序。我试图将JavaCast函数应用于地图的键,但它不起作用。显然,ColdFusion期望密钥是String而不是Int。

下面是示例代码(没有JavaCast尝试)来说明我的情况:

<!--- Create the TreeMap --->
<cfset map = createObject("java", "java.util.TreeMap").init()>

<!--- Add Ranges to it --->
<!--- From 1 to 3 return "Range 1". --->
<cfset t = StructNew()>
<cfset t.finish = JavaCast("int", 3)>
<cfset t.value = "Range 1">
<cfset map.put(1, t)><!--- This 1 is the one I tried to JavaCast --->

<!--- From 4 to 10 return "Range 2". --->
<cfset t = StructNew()>
<cfset t.finish = JavaCast("int", 10)>
<cfset t.value = "Range 2">
<cfset map.put(4, t)>

<!--- From 20 to 50 return "Range 3". --->
<cfset t = StructNew()>
<cfset t.finish = JavaCast("int", 50)>
<cfset t.value = "Range 3">
<cfset map.put(20, t)>

<!--- From 75 to 80 return "Range 4". --->
<cfset t = StructNew()>
<cfset t.finish = JavaCast("int", 80)>
<cfset t.value = "Range 4">
<cfset map.put(75, t)>

<!--- Debug. Output the Map content --->
<cfoutput>Debug - Ordered map: #map.toString()#</cfoutput><br />

<!--- Search number --->
<cfset key = 9>
<cfset entry = map.floorEntry(key)>

<!--- Debug. Output entry found --->
<cfoutput>Debug - Entry found: #entry#</cfoutput><br />

<!--- Debug. Output result --->
<cfif isNull(entry)>
    <cfoutput>Too small</cfoutput>
<cfelseif key lte entry.getValue().finish>
    <cfoutput>Debug - Result: #entry.getValue().value#</cfoutput>
<cfelse>
    <cfoutput>Too large</cfoutput>
</cfif>

这是上面代码生成的输出:

Debug - Ordered map: {1={FINISH={3},VALUE={Range 1}}, 20={FINISH={50},VALUE={Range 3}}, 4={FINISH={10},VALUE={Range 2}}, 75={FINISH={80},VALUE={Range 4}}}
Debug - Entry found: 75={FINISH={80},VALUE={Range 4}}
Debug - Result: Range 4

当我期待它时:

Debug - Ordered map: {1={FINISH={3},VALUE={Range 1}}, 4={FINISH={10},VALUE={Range 2}}, 20={FINISH={50},VALUE={Range 3}}, 75={FINISH={80},VALUE={Range 4}}}
Debug - Entry found: 4={FINISH={10},VALUE={Range 2}}
Debug - Result: Range 2

所以我的问题是,我需要做些什么才能让TreeMap按照我想要的方式工作,即数字顺序?

顺便说一下,我正在使用ColdFusion 9。

非常感谢!

1 个答案:

答案 0 :(得分:2)

(来自评论)

首先想到的是,您没有将所有key值都转换为整数,因此当TreeMap执行其比较时,它们将被视为字符串。这可以解释为什么floorEntry返回错误的结果。它正在比较strings,而不是integers。尝试将所有键强制转换为整数,它应该按预期工作。

 <cfset map.put( javacast("int", 1), t)>
 ...
 <cfset map.put( javacast("int", 75), t)>
 <cfset key = 9>
 <cfset entry = map.floorEntry( javacast("int", key) )>