生成Excel列名的Scala流/迭代器?
我想要一个生成Excel列名的Scala流/迭代器 e、 g.第一个是“A”,第二个是“B”,然后是“AA”或更高 我有一个函数(如下所示),它可以从一个索引中生成,但是每次我要做的就是按顺序生成它们时,从一个索引中生成它们似乎是浪费。在实践中,这不是一个问题,所以我可以使用这种方法,但我只是想问一下是否有人有更好的方法生成Excel列名的Scala流/迭代器?,scala,Scala,我想要一个生成Excel列名的Scala流/迭代器 e、 g.第一个是“A”,第二个是“B”,然后是“AA”或更高 我有一个函数(如下所示),它可以从一个索引中生成,但是每次我要做的就是按顺序生成它们时,从一个索引中生成它们似乎是浪费。在实践中,这不是一个问题,所以我可以使用这种方法,但我只是想问一下是否有人有更好的方法 val charArray = ('A' to 'Z').toArray def indexToExcelColumnName(i:Int):String = { if (
val charArray = ('A' to 'Z').toArray
def indexToExcelColumnName(i:Int):String = {
if (i < 0) {
""
} else {
indexToExcelColumnName((i / 26) - 1) + charArray(i % 26)
}
}
val charArray=('A'到'Z')。toArray
def indexToExcelColumnName(i:Int):字符串={
if(i<0){
""
}否则{
indexToExcelColumnName((i/26)-1)+字符集(i%26)
}
}
类似的东西
class ExcelColumnIterator extends Iterator[String]{
private var currentColumnName = "A"
private def nextColumn(str: String):String = str.last match {
case 'Z' if str.length == 1 => "AA"
case 'Z' => nextColumn(str.init) + 'A'
case c => str.init + (c+1).toChar
}
override def hasNext = true
override def next() = {
val t = currentColumnName
currentColumnName = nextColumn(currentColumnName)
t
}
}
首先,我要写一些生成固定大小名称的东西
val namesOfLength: Int => Iterator[String] = {
case 1 => ('A' to 'Z').iterator.map(_.toString)
case n => ('A' to 'Z').iterator.flatMap(a => namesOfLength(n-1).map(a + _))
}
或
然后把它们锁在一起
Iterator.iterate(1)(_ + 1).flatMap(namesOfLength).take(100).toStream.force
这里有一个单行程序解决方案:
Stream.iterate(List(""))(_.flatMap(s => ('A' to 'Z').map(s + _)))
.flatten.tail
如果您希望获得迭代器
,请将迭代器.迭代器
替换为流.迭代器
,并将拖尾替换为拖尾
这里有一个你可能会觉得有趣的替代解决方案:
Stream.from(0)
.map(n => Integer.toString(n, 36))
.map(_.toUpperCase)
.filterNot(_.exists(_.isDigit))
Stream.from(0)
.map(n => Integer.toString(n, 36))
.map(_.toUpperCase)
.filterNot(_.exists(_.isDigit))