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
相关产品推荐
相关产品推荐

