Java coldfusion在数组中查找结构
我有一个对象,它包含一个结构数组,生成该数组的代码在查询上循环,从查询的每一行获取各种值并填充一个结构,当该行完成时,它将其附加到数组中,然后该过程再次开始:Java coldfusion在数组中查找结构,java,arrays,coldfusion,coldfusion-9,Java,Arrays,Coldfusion,Coldfusion 9,我有一个对象,它包含一个结构数组,生成该数组的代码在查询上循环,从查询的每一行获取各种值并填充一个结构,当该行完成时,它将其附加到数组中,然后该过程再次开始: <cfscript> variables.x = 1; variables.aArray = []; // loop over my query while(variables.x lte variables.qQuery.recordcount){ variables.stSt
<cfscript>
variables.x = 1;
variables.aArray = [];
// loop over my query
while(variables.x lte variables.qQuery.recordcount){
variables.stStruct = {};
variables.stStruct.nID = variables.qQuery.id[variables.x];
variables.stStruct.sText = variables.qQuery.text[variables.x];
//etc...
arrayAppend(variables.aArray,variables.stStruct);
variables.x++;
}
variables.oObject.setArray(variables.aArray);
</cfscript>
变量x=1;
variables.aArray=[];
//循环我的查询
while(variables.x lte variables.qQuery.recordcount){
variables.stStruct={};
variables.stStruct.nID=variables.qQuery.id[variables.x];
variables.stStruct.sText=variables.qQuery.text[variables.x];
//等等。。。
arrayAppend(variables.aArray,variables.stStruct);
变量.x++;
}
variables.ooobject.setArray(variables.aArray);
稍后,在我的代码中,我希望能够仅使用nID来获取该数组中项目的详细信息。我不知道nID的数组位置,这意味着使用一种复杂的方法试图找到它
我有一个想法,通过修改上面的代码,在它旁边创建一个位置结构
<cfscript>
variables.x = 1;
variables.aArray = [];
variables.stTracker = {};
while...yadda
variables.stStruct = {};
yadda yadda
structInsert(variables.stTracker,"variables.qQuery.id[variables.x]","variables.x");
variables.x++;
while end
variables.oObject.setArray(variables.aArray);
variables.oObject.setTracker(variables.stTracker);
</cfscript>
变量x=1;
variables.aArray=[];
variables.stTracker={};
而…雅达
variables.stStruct={};
雅达雅达
structInsert(variables.stTracker,“variables.qQuery.id[variables.x],“variables.x”);
变量.x++;
当结束时
variables.ooobject.setArray(variables.aArray);
variables.ooobject.setTracker(variables.stTracker);
这意味着我可以执行类似于variables.nPosition=structFindKey(variables.oObject.getTracker(),'88')[1]的操作代码>。这仍然感觉很不雅观,我想知道我是否错过了一些比我现在做的容易得多的东西
如果有一个使用java的解决方案来解决这个问题,我会非常高兴。我建议执行。它将允许您使用SQL语句查询内存中的现有结果集。这是假设您需要的所有数据都已经在现有查询中可用(听起来像是来自您的问题)
查询的一个示例查询是:
<cfquery dbtype="query" name="qoqexample">
SELECT id, text, other_columns
FROM variables.qQuery
WHERE id = <cfqueryparam cfsqltype="cf_sql_integer" value="#nID#">
</cfquery>
选择id、文本、其他_列
从variables.qQuery
其中id=
您可以使用JavaLinkedHashMap
,它的工作原理与结构类似,但将保持添加元素的顺序。这意味着您根本不需要使用阵列(不清楚这是否是您的问题)
您将能够在该对象上使用所有本机CF
函数,就像使用普通结构一样
var container = createObject("java", "java.util.LinkedHashMap").init();
for (var x = 1; x <= qQuery.recordCount; x++) {
container[qQuery['nid'][x]] = qQuery['stext'][x];
}
我认为您考虑过的另一个选项是将nid
映射到数组索引位置,作为键
:
var keys = {};
var container = [];
for (var x = 1; x <= qQuery.recordCount; x++) {
var item = {};
item[qQuery['nid'][x]] = qQuery['stext'][x];
container[x] = item;
keys[qQuery['nid'][x]] = x;
}
var-keys={};
var容器=[];
对于(var x=1;xCFLib.org),它似乎有一个可能的候选者:
项目添加到数组中的顺序重要吗?不重要,但现在它们进入数组的顺序与我的非常相似,但是查询的顺序出来了。使用此解决方案,我假设您建议我在对象上使用查询,例如variables.oObject.setQuery(variables.qQuery)
然后在我需要访问QoQ信息时运行QoQ。这是一个解决方案,但如果是这样的话,就不是一个优雅的解决方案。不,我不是建议你将查询添加到你的对象中。我可能不理解你的全部代码,但我假设你可以像现在一样将对象和查询作为单独的实体保留。如果你需要d要查询结果集,请从变量.qQuery
variable.ahh查询来自DAO,在DAO中有一个填充对象的函数…因此,一旦填充对象,查询就不再存在,因此我必须使用原始查询填充对象上的setter,以使此解决方案起作用。我想我可能是想把事情搞得一团糟,把它变成一个结构的结构,这样就不需要LinkedHashMap了。Re:这就不需要LinkedHashMap了。不像CF结构,LinkedHashMap有一个“可预测的迭代顺序”。从某种意义上说,它结合了数组和结构的特性。如果您需要保持元素的顺序,这与标准CF结构有很大的区别。这是真的,但出于我自己的需要,因为不需要保持顺序,LinkedHashMap只需要一个结构的结构就行了。但是好建议@Leigh@Jareded-(编辑)啊,好的。我错过了注释提及顺序并不重要。在这种情况下,你是对的。结构的结构是最简单的。然后你可以通过id查找。对于数组,除了循环查找“id”上的匹配项外,真的没有其他选择。
var keys = {};
var container = [];
for (var x = 1; x <= qQuery.recordCount; x++) {
var item = {};
item[qQuery['nid'][x]] = qQuery['stext'][x];
container[x] = item;
keys[qQuery['nid'][x]] = x;
}
<cfscript>
/**
* Returns the position of an element in an array of structures.
*
* @param array Array to search. (Required)
* @param searchKey Key to check in the structs. (Required)
* @param value Value to search for. (Required)
* @return Returns the numeric index of a match.
* @author Nath Arduini (nathbot@gmail.com)
* @version 0, June 11, 2009
*/
function arrayOfStructsFind(Array, SearchKey, Value){
var result = 0;
var i = 1;
var key = "";
for (i=1;i lte arrayLen(array);i=i+1){
for (key in array[i])
{
if(array[i][key]==Value and key == SearchKey){
result = i;
return result;
}
}
}
return result;
}
</cfscript>
ArrayOfStructsFind(variables.oObject.getArray(),"nID","12345")