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

Kotlin中如何按索引迭代访问HashMap的keys集合?

解决方案

核心问题在于HashMap的Key是无序的Set集合,无法通过索引访问,且你原代码的逻辑错误地将每行数据对应到单个表头Key。正确的做法是先保存表头的有序列表,再通过表头顺序匹配每行的单元格数据。

修改后的代码

private fun getData() {
    val doc = get_data()
    val table = doc.select(".table")
    val dataMap = HashMap<String, MutableList<String>>()
    val headers = mutableListOf<String>() // 保存有序的表头

    // 初始化表头和空数据列表
    table.select("thead tr").forEach { row ->
        row.getElementsByTag("th").forEach { cell ->
            val headerText = cell.text()
            headers.add(headerText)
            dataMap[headerText] = mutableListOf()
        }
        Log.d("EMPTY Map:", dataMap.toString())
    }

    // 处理表格主体数据
    table.select("tbody tr").forEach { row ->
        row.getElementsByTag("td").forEachIndexed { index, cell ->
            val header = headers[index] // 通过索引获取对应表头
            dataMap[header]?.add(cell.text()) // 将单元格数据添加到对应表头的列表中
        }
    }

    val df = dataFrameOf(dataMap)
}

关键修正点

  • 保存有序表头:用headers列表存储表头文本,确保和HTML表格的表头顺序完全一致,这是匹配每行单元格的核心依据。
  • 按索引匹配表头:遍历每行单元格时,用forEachIndexed获取单元格的索引,通过索引从headers中拿到对应的表头Key,再将数据添加到dataMap对应的列表里。
  • 明确Map类型:将HashMap<String, ArrayList<*>>改为HashMap<String, MutableList<String>>,避免泛型模糊导致的类型安全问题。

原代码逻辑问题说明

原代码中遍历表格行时,试图用递增的index从dataMap.keys中取Key,这不仅因为Set无法索引访问而报错,更重要的是逻辑完全错误——每行的多个单元格应该对应多个表头Key,而不是整行对应一个Key。

内容的提问来源于stack exchange,提问作者David Frick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:11:25