Groovy序列的一个数字

时间:2011-06-16 12:59:48

标签: groovy

如何在Groovy中获取给定数字的序列,例如:

def number = 169
// need a method in groovy to find the consecutive numbers that is, 1,6,9,16,69,169
// not 19!

Groovy中有一个名为subsequences()的方法,但这并不完全可以完成这项工作。谁能说我怎么能用Groovier方式做到这一点?或者有内置方法吗?

6 个答案:

答案 0 :(得分:4)

在Groovy控制台中运行

def number = 169
number = number.toString() as List

def results = []

0.upto(number.size()) {numDigits ->

  for(int startPos = 0; startPos + numDigits < number.size(); startPos++) {
    def result = number[startPos..startPos + numDigits]
    results << result.join().toInteger()
  }
}

assert results == [1, 6, 9, 16, 69, 169]

答案 1 :(得分:3)

考虑Don's answer above(效果很好),我想出了同样的Groovy-er版本:

def number = 181

number = number.toString() as List

def results = (0..<number.size()).inject([]) { res, numDigits ->
  res.addAll( (0..<number.size()-numDigits).collect { startPos ->
    number[startPos..startPos + numDigits].join() as int
  } )
  res
}

println results

答案 2 :(得分:3)

虽然游戏很晚,但这里的解决方案不如@ tim's那么复杂,但也可以解决问题:

def str = 169 as String
def result = [] as SortedSet
(0..<str.length()).each { i ->
    (i..<str.length()).each { j ->
        result << str[i..j].toInteger()
    }
}

修改

代码就像两个嵌套循环一样,迭代数字的String表示并从中提取各种子字符串。

外部循环表示子字符串的起始索引,内部循环表示子字符串的结束索引。外部循环将从String的开头到结尾,而内部循环从当前的起始索引开始,从那里开始到结束。

as SortedSet确保结果中没有重复的数字,并且数字按升序排序。

 1 6 9 
 -----
 0 1 2  <-- index
 =====
[1]6 9  (i=0; j=0)
[1 6]9  (i=0; j=1)
[1 6 9] (i=0; j=2)
 1[6]9  (i=1; j=1)
 1[6 9] (i=1; j=2)
 1 6[9] (i=2; j=2)

答案 3 :(得分:1)

没有必要从Integer到String再到List然后再返回到带有join()的String,因为String的行为与任何序列完全相同:

// Sorry for the silly name. Couldn't think of anything better :)
def subInts(num) {
    def str = num as String
    (1..str.length()).inject([]) { res, size ->
        res += (0..str.length() - size).collect { i -> str[i..< i + size] as int }
    }
}

assert subInts(169) == [1, 6, 9, 16, 69, 169]

除了转换少一点之外,这是tim_yates solution的副本。希望它有所帮助。

答案 4 :(得分:0)

STrictly在算法上...... 你可以这样做:

num = 169
ar = []

while ( num >= 1 ) {
    str = num.toString()
    ar.add(str[str.indexOf('.')-1])
    num = num/10.toInteger()
}

len = ar.size()
for ( i in 1..len-1 ) {
    for (j in 0..len-i-1) {
        str = ""
        for ( k in 0..i) {
           str += ar.get(j+k)
        }
        ar.add(str)
    }
}

我认为这应该有用。

答案 5 :(得分:-1)

oneliner

(0..<n.size()).inject([]) {a,b -> (0..<n.size()-b).each {a << (n[it] as Integer)};a}