Groovy 棘手的数组列表迭代

Groovy tricky Array List iteration

我正在使用以下输出迭代数组列表:

  1. 理查德
  2. 柯林斯
  3. 杜卡迪
  4. 50
  5. 伦敦
  6. 巴腾

进程已完成,退出代码为 0

所有这些元素都在我的对象中 "Results"

我的代码:

def list = results[0]
    list.eachWithIndex { val, idx ->
        println "${idx}. ${val}" }

通过这次迭代,我同时获得了索引和元素。

我需要知道是否可以在数组列表中迭代并同时将我的索引转换为单词,例如

A. Richard
B. Collins
C. Ducati
D. 50
E. London
F. Barten

我正在实施和自动化,但系统无法从元素中捕获索引。也许用文字代替它们是可能的

谢谢大家!

你可以试试类似

的东西
branches = ['Richard', 'Collins', 'Ducati', '50', 'London', 'Barten']

char a = 'A'
branches.eachWithIndex { val, idx ->
  println "${(idx + (a as int)) as char}. ${val}" 
}

因此您可以将字符转换为整数 (ASCII),然后添加索引的值,然后将其重新转换为字符。根据列表中值的数量,您可以创建一个“更好的”intToString() 方法,但您应该已经在示例中了解了这个想法

另一种方式,如果你想涵盖 运行 单字母索引值的情况:

def values   = ['Richard', 'Collins', 'Ducati', '50', 'London', 'Barten']
def alphabet = ('a'..'c')

values.indexed().each { i, v -> 
  def index = encode(i, alphabet)
  println "${index}. $v"
}

String encode(index, alphabet) {  
  def result = new StringBuilder()
  def s = alphabet.size()
  index += s // remove if we are ok with one letter indicies

  while (index >= 0) {
    result.insert(0, alphabet[index % s as int])
    index = (index / s as long) - 1
  }
  
  result
}

当 运行 时打印:

─➤ groovy solution.groovy
aa. Richard
ab. Collins
ac. Ducati
ba. 50
bb. London
bc. Barten

其中索引的字母表可通过 ('a'..'z') 范围语法配置。

例如,对于大写字母和数字的组合,您可以这样做:

def alphabet = ('A'..'Z') + ('0'..'9')

这将产生:

─➤ groovy solution.groovy
AA. Richard
AB. Collins
AC. Ducati
AD. 50
AE. London
AF. Barten

其中索引值将在字母 Z 之后翻转为数字。

有了这个,即使对于 values 集合中的大量输入项,您也永远不会“运行 超出”索引值。 encode 方法只会连续生成更长的索引值,您输入的整数值越大。要减少大输入整数的索引值的长度,您可以使用更长的字母表。