如何在 groovy 脚本中将数组排序为一组 3 个元素
How to sort an array in to group of 3 elements in groovy script
我是 groovy 脚本编写的新手,并尝试在数组下方进行排序,其中排序是作为三个元素的一组进行的。
I/p: a = [9, 4, 5, 8, 9, 7, 4, 2, 3]
Expected O/P: 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
感谢任何帮助。
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]
这是一种方法。它不是 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
您正在尝试使用冒泡排序,但方法不正确。
第一个问题是(a[i] > a[j]),这里i是常量,在冒泡排序中我们在这里使用j和j+1,因为我们比较2个连续的元素。如果我们将 i 保留在这里,那么 i 在循环中保持不变
正在为您排序第一组元素,因为前 3 个元素是 9 4 5 因为 9>4 所以你交换了 9>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
这符合您提到的逻辑或我们可以说的方式
我是 groovy 脚本编写的新手,并尝试在数组下方进行排序,其中排序是作为三个元素的一组进行的。
I/p: a = [9, 4, 5, 8, 9, 7, 4, 2, 3] Expected O/P: 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
感谢任何帮助。
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]
这是一种方法。它不是 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
您正在尝试使用冒泡排序,但方法不正确。
第一个问题是(a[i] > a[j]),这里i是常量,在冒泡排序中我们在这里使用j和j+1,因为我们比较2个连续的元素。如果我们将 i 保留在这里,那么 i 在循环中保持不变
正在为您排序第一组元素,因为前 3 个元素是 9 4 5 因为 9>4 所以你交换了 9>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
这符合您提到的逻辑或我们可以说的方式