我正在尝试随机地对数组中的整数进行混洗。这看起来很简单,但我必须将它们打乱,以便它们仍然保持特定的顺序(奇数、偶数、奇数、偶数等)。例如,如果原始数组包含1、2、3、4、5、6、7、8,则混洗后的数组可能看起来像5、8、7、4、1、6、3、2,但始终保持相同的交替顺序,从奇数开始。
谢谢你的帮助。顺便说一下,这不是我真正的家庭作业问题。我只是想弄清楚怎么做,这样我才能做我的家庭作业。我不知道该从何说起。
发布于 2019-05-13 06:22:23
我可能会:
发布于 2019-05-14 07:08:48
您可以让所需的数组元素显示为List<Integer>,方法是相应地实现AbstractList,作为相关数组元素上的视图。然后,列表上的一个简单的Collections#shuffle就可以做到这一点。
乍一看,这似乎是“非常规的”,但它有一些优点:
int数组上运行(尽管您可以根据需要将其更改为Integer )<
在此处作为MCVE实施:
import java.util.AbstractList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class ConstrainedShuffle
{
public static void main(String[] args)
{
int array[] = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 };
System.out.println("Before: " + Arrays.toString(array));
constrainedShuffle(array, new Random(0));
System.out.println("After : " + Arrays.toString(array));
}
private static void constrainedShuffle(int array[], Random random)
{
Collections.shuffle(asList(array, 0, 2), random);
Collections.shuffle(asList(array, 1, 2), random);
}
private static List<Integer> asList(int array[], int offset, int stride)
{
int size = (array.length - offset + stride - 1) / stride;
return new AbstractList<Integer>()
{
@Override
public Integer get(int index)
{
return array[offset + index * stride];
}
@Override
public Integer set(int index, Integer element)
{
int i = offset + index * stride;
Integer old = array[i];
array[i] = element;
return old;
}
@Override
public int size()
{
return size;
}
};
}
}发布于 2019-05-13 06:30:29
混洗数组的一种方法是对项进行“随机排序”。
例如,如果您使用的是Java 8或更高版本,您可以提供一个排序比较器作为如下所示的lambda,它只是在排序操作期间的每次迭代中返回正或负索引,以获得混洗后的结果:
ArrayList<Integer> list = new ArrayList<>();
Random random = new Random();
/* Ordered input list */
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
/* Apply random sorting behavior to achieve obtain a shuffled array */
Collections.sort(list, (Integer a, Integer b) -> {
/* Obtain random number between 0 - 1 */
Integer randomValue = random.nextInt(1);
/* Return random positive or negative value which causes "shuffled"
sort */
return randomValue == 1 ? 1 : -1;
});
/* list is now shuffled */https://stackoverflow.com/questions/56103871
复制相似问题