You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
    }
}

额外修正点

  1. 删除原代码中无效的for循环else分支:for循环正常结束后不会进入else,该分支无执行可能。
  2. 修正条件判断:将mapKeyDOORSValue!== null || mapKeyDOORSValue !== ""改为&&,避免空字符串被判定为有效数据。

内容的提问来源于stack exchange,提问作者Riyah P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:54:22