我是groovy脚本的新手,并尝试在下面的数组中排序,其中排序发生在三个元素的组中。
I / p:a = [9,4,5,8,9,7,4,2,3] 预期执行额:4,5,9,7,8,9,2,3,4
我尝试了很多组合但是我的循环要么进入无限循环,要么我只能排序第一组三个元素
for (int i = 0; i < a.size()-1; i++) {
for (int j = i + 1; j<3; j++) {
if (a[i] > a[j]) `enter code here`
{
temp = [0]
temp = a[i]
a[i] = a[j]
a[j] = temp
}
}
}
for (int i = 0; i < a.size()-1; i++) {
log.info a[i]+ ","
}
log.info "Data in ascending order" + a
感谢任何帮助。
答案 0 :(得分:3)
Groovy对于这类任务非常强大:
def a = [9, 4, 5, 8, 9, 7, 4, 2, 3]
def sorted = a.collate( 3 ).collect{it.sort()}
assert sorted == [[4, 5, 9], [7, 8, 9], [2, 3, 4]]
assert sorted.flatten() == [4, 5, 9, 7, 8, 9, 2, 3, 4]
答案 1 :(得分:0)
这是一种方法。它不是 Grooviest 代码,但它既简单又合理地接近原始代码。主要技巧是使用带有步骤的range(以便i
从0,3,6开始):
def a = [9, 4, 5, 8, 9, 7, 4, 2, 3]
def n = a.size() - 1
assert a.size() % 3 == 0
def result = []
// i = 0, 3, 6
for (i in (0..n).step(3)) {
def list = [a[i], a[i+1], a[i+2]]
def x = list.min()
def z = list.max()
def y = list.find { item -> item != x && item != z }
result.addAll([x, y, z])
}
assert [4,5,9,7,8,9,2,3,4] == result
答案 2 :(得分:0)
您正在尝试使用冒泡排序,但不是以正确的方式。
第一个问题是(a [i]&gt; a [j]),这里我是常数,我们在这里使用j和j + 1进行冒泡排序,因为我们比较了2个连续的元素。如果我们保持在这里,那么我在循环中是恒定的
第一组元素正在为你排序,因为前3个元素是9 4 5因为9> 4所以你交换了9&gt; 5所以交换完成所以他们交换了
冒泡排序的另一个问题是我们需要2个循环进行排序。一次性只有相邻的元素被排序。即假设元素是3 2 1.所以它将像2 3 1(2,3),然后是2 1 3(1,3)。你需要再多1次迭代(外循环)才能使它成为1 2 3。
以下是冒泡排序逻辑,它使用与您相同的逻辑,并提供您需要的输出,而无需使用任何可用的特殊方法
我试图找出无限的逻辑,但却无法破解那个......
下面的代码以最简单的方式https://ideone.com/B9fY0A
工作1)第一个循环是2个中断元素到3个集合...所以我们选择1 4 8个元素
2)第三个循环以第一个循环决定的元素开始
3)第二个循环是为3个元素进行排序(冒泡排序需要2个循环)
def a = [9, 4, 5, 8, 9, 7, 4, 2, 3] ;
def temp=0;
print "ok";
for(int i =0; i <a.size(); i=i+3)
{
print a[i] + " "
for(int k=0; k<2;k++)
{
for(int j=i;j<i+2;j++)
{
// print a
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
log.info a
这是遵循您提到的逻辑或我们可以说的方式