我有一个四列的文本文件,并想用它创建两个 vector 。
我打算将第一列和第二列用作混合索引。
因此,第一列和第二列为整数,第三列和第四列为double。
在FORTRAN中,它将是:

10 READ("4Column_file.txt",*,END=20)N,M,T1,T2
   IG=(N*(N+1))/2+M+1
   CC(IG)=T1
   CS(IG)=T2
   GOTO 10
20 CONTINUE

如何使用Kotlin或Java?

输入形式为:
5   5  -0.244048470535508183D+00  -0.129800076712784507D+01
6   0  -0.468652527040705080D+01   0.000000000000000000D+00

输出将是CC [IG]和CS [IG] vector 加载。

例如在第一行:
IG=(5*(5+1))/2+5+1=21因此CC [21] =-0.244048470535508183D + 00和CS [21] =-0.129800076712784507D + 01。

在第二行:
IG=(6*(6+1))/2+5+1=27因此CC [27] =-0.468652527040705080D + 01和CS [27] = 0.000000000000000000D + 00

最佳答案

您可以在Kotlin中执行以下操作:

val length = 20 // Some default length
val cc = arrayOfNulls<String>(length)
val cs = arrayOfNulls<String>(length)

val lineRegex = "\\s+".toRegex()

File("4Column_file.txt").useLines { lineSequence ->
    for (line in lineSequence) {
        val (n, m, t1, t2) = line.split(lineRegex)
        val nInt = n.toInt()
        val mInt = m.toInt()

        val ig = (nInt * (nInt + 1)) / 2 + mInt + 1
        cc[ig] = t1
        cs[ig] = t2
    }
}

如果您事先不知道长度,则需要先将所有行读入某个数据类。然后,您需要找到ig的最大值,并创建该大小的数组。就像是:
data class Row(val n: Int, val m: Int, val t1: String, val t2: String) {
    val ig: Int = (n * (n + 1)) / 2 + m + 1
}

// rowList is List<Row> after parsing
val maxIdx = rowList.maxBy { it.ig } ?: -1

val cc = arrayOfNulls<String>(maxIdx + 1)
val cs = arrayOfNulls<String>(maxIdx + 1)

for (row in rowList) {
    cc[row.ig] = row.t1
    cs[row.ig] = row.t2
}

09-05 12:58