如何在JavaScript文件中为Hashtable的每个Key创建对应ArrayList?
问题描述
我在Ultra-Studio中用JavaScript编写调用Java类的代码,现有ircDOORSHashTable存储键值对。需求是为每个Key创建以该Key命名的ArrayList,并将对应的值存入(例如以SW_Version为ArrayList名,存入所有对应值)。需要直接从Hashtable提取数据、按键分组并将值加入对应ArrayList,但不知道怎么实现。
现有变量声明代码:
var legendRows = new Packages.java.util.ArrayList(); var xmlItems = new Packages.java.util.ArrayList(); var modeItems = new Packages.java.util.ArrayList(); var ircDOORSHashTable = new java.util.Hashtable();
相关函数代码:
function getDOORSData(documentID, contentBean, text) { var xmlText = cleanTable(text); try { var docFactory = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance(); var docBuilder = docFactory.newDocumentBuilder(); var sbis = new Packages.org.xml.sax.InputSource(new java.io.StringReader(xmlText)); var document = docBuilder.parse(sbis); var root = document.getDocumentElement(); var nodeList = root.getElementsByTagName("tr"); for (row = 0; row < nodeList.getLength(); row++) { var node = nodeList.item(row); var mapKeyDOORS = new java.lang.String(node.getElementsByTagName("td").item(0).getTextContent().trim()); var mapKeyDOORSValue = new java.lang.String(node.getElementsByTagName("td").item(1).getTextContent().trim()); if((mapKeyDOORS !== null && mapKeyDOORS!=="") && (mapKeyDOORSValue!== null || mapKeyDOORSValue !== "")){ // 返回行项数组 var ibplValues = parseFields(mapKeyDOORSValue); for (var f = 0; f < ibplValues.length; f++) { log("Inside getDOORSData function. In first Pass") checkIBPL(ibplValues[f], documentID, contentBean, mapKeyDOORS); }else{ log("ArrayList xmlItem: " + ibplValues[i]); xmlItems.add(ibplValues[f]); ircDOORSHashTable.put(mapKeyDOORS, ibplValues[i]); } } } } catch(e){ log ("Error found in getDOORSData function " + e); } }
解决方案
核心思路
JavaScript无法直接动态创建以变量名命名的Java ArrayList(易引发作用域冲突),推荐用Java HashMap存储「Key -> 对应ArrayList」的映射关系,既实现按Key分组,又能便捷存取对应列表。
步骤1:创建分组容器
先声明HashMap管理所有按Key分组的ArrayList:
// 键为原Hashtable的Key,值为对应Java ArrayList var keyToArrayListMap = new java.util.HashMap();
步骤2:修正值存储逻辑(避免覆盖)
原代码中ircDOORSHashTable.put会覆盖相同Key的旧值,需调整为:检查Key是否已存在,存在则追加值到对应列表,不存在则新建列表并存入。修改getDOORSData函数内的逻辑:
// 替换原if块内的逻辑 if((mapKeyDOORS !== null && mapKeyDOORS!=="") && (mapKeyDOORSValue!== null && mapKeyDOORSValue !== "")){ var ibplValues = parseFields(mapKeyDOORSValue); for (var f = 0; f < ibplValues.length; f++) { log("Inside getDOORSData function. In first Pass") checkIBPL(ibplValues[f], documentID, contentBean, mapKeyDOORS); // 处理分组逻辑 var targetList = keyToArrayListMap.get(mapKeyDOORS); if (targetList == null) { // 新建ArrayList并绑定到当前Key targetList = new Packages.java.util.ArrayList(); keyToArrayListMap.put(mapKeyDOORS, targetList); } // 将当前值加入对应列表 targetList.add(ibplValues[f]); // 若需保留ircDOORSHashTable,可将整个列表存入 ircDOORSHashTable.put(mapKeyDOORS, targetList); } }
步骤3:获取指定Key的ArrayList
后续使用时直接从HashMap中取出对应列表:
// 示例:获取SW_Version对应的ArrayList var swVersionList = keyToArrayListMap.get("SW_Version"); if (swVersionList != null) { // 遍历列表做后续操作 for (var i = 0; i < swVersionList.size(); i++) { var value = swVersionList.get(i); log("SW_Version值:" + value); } }
额外修正点
- 删除原代码中无效的
for循环else分支:for循环正常结束后不会进入else,该分支无执行可能。 - 修正条件判断:将
mapKeyDOORSValue!== null || mapKeyDOORSValue !== ""改为&&,避免空字符串被判定为有效数据。
内容的提问来源于stack exchange,提问作者Riyah P
相关产品推荐
相关产品推荐

