如何在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方式做到这一点?或者有内置方法吗?
答案 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}