我需要在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。
非常感谢!
答案 0 :(得分:2)