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

Kotlin中如何从文件读取的可变列表调用特定行与列?

解决方案:访问文件特定行与列并映射到类对象

你当前代码的问题在于:lines是useLines lambda的局部变量,lambda执行完毕后就无法再访问它。但你已经把所有行读取到了myList中,后续操作应该直接基于myList来进行。

方法一:基于已读取的列表操作

直接使用myList访问特定行,再拆分列进行判断:

import java.io.File

class Inventory(var fileName: String) {
    override fun toString(): String {
        return fileName.trimIndent()
    }

    init {
        val myList = mutableListOf<String>()
        File(fileName).useLines { lines -> myList.addAll(lines) }

        // 示例:遍历所有行,判断第一列内容为指定值时创建类对象
        for (line in myList) {
            // 根据实际文件的列分隔符拆分(比如逗号、制表符"\t")
            val columns = line.split(",")
            // 避免索引越界,先判断列数是否足够
            if (columns.size >= 1 && columns[0] == "--column1--") {
                // 这里执行你的类对象创建逻辑
                // val item = YourCustomClass(columns[0], columns[1], ...)
            }
        }

        // 若要访问特定行,直接通过索引获取
        // 比如获取第二行(索引从0开始)
        if (myList.size > 1) {
            val targetLine = myList[1]
            val targetColumns = targetLine.split(",")
            // 处理该行
        }
    }
}

方法二:流式处理(更节省内存)

如果文件较大,不需要把所有行都加载到内存,可以直接在useLines的lambda里完成处理,无需额外存储列表:

import java.io.File

class Inventory(var fileName: String) {
    override fun toString(): String {
        return fileName.trimIndent()
    }

    init {
        File(fileName).useLines { lines ->
            // 遍历每行,直接处理
            lines.forEach { line ->
                val columns = line.split(",")
                if (columns.size >= 1 && columns[0] == "--column1--") {
                    // 创建类对象并处理
                    // val item = YourCustomClass(columns[0], columns[1], ...)
                }
            }

            // 若要获取特定行,可以通过index判断
            val targetLine = lines.elementAtOrNull(1) // 获取第二行,不存在则返回null
            targetLine?.let {
                val columns = it.split(",")
                // 处理该行
            }
        }
    }
}

关键注意事项

  • 列拆分的分隔符要和你的实际文件格式匹配,比如CSV用逗号,TSV用制表符\t。
  • 处理列时一定要先判断列数是否足够,避免IndexOutOfBoundsException。
  • 若文件有表头,可通过drop(1)跳过第一行,比如myList.drop(1).forEach { ... }。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:45:48