生成Excel列名的Scala流/迭代器?

生成Excel列名的Scala流/迭代器?,scala,Scala,我想要一个生成Excel列名的Scala流/迭代器 e、 g.第一个是“A”,第二个是“B”,然后是“AA”或更高 我有一个函数(如下所示),它可以从一个索引中生成,但是每次我要做的就是按顺序生成它们时,从一个索引中生成它们似乎是浪费。在实践中,这不是一个问题,所以我可以使用这种方法,但我只是想问一下是否有人有更好的方法 val charArray = ('A' to 'Z').toArray def indexToExcelColumnName(i:Int):String = { if (

我想要一个生成Excel列名的Scala流/迭代器

e、 g.第一个是“A”,第二个是“B”,然后是“AA”或更高

我有一个函数(如下所示),它可以从一个索引中生成,但是每次我要做的就是按顺序生成它们时,从一个索引中生成它们似乎是浪费。在实践中,这不是一个问题,所以我可以使用这种方法,但我只是想问一下是否有人有更好的方法

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))