[英]How to generate a JSON file from elements of an arraylist in random order in Java?
[英]generate random order but with constraint in java
当我放置一个整数列表时,如何生成另一个具有约束的随机顺序?
例如,我将整数1、2、3、4放入集合中,当我尝试打印结果时,例如“ 1 2 3 4”,“ 1 2 4 3”,“ 1 3 2 4”,“ 2 1 3” 4”或“ 2 1 4 3”(1必须在3之前,2必须在4之前)
提前致谢
您可以考虑的一件事是随机交换元素。 您可以在集合中选择一个随机位置,然后将该位置中的元素与下一个元素交换。 这样,您可以防止1与3交换,或2与4交换。您可以重复执行此操作,直到数字正确地加扰为止:
[1, 2, 3, 4]
随机数为0,与位置1的元素交换。
[2, 1, 3, 4]
随机数为1,与位置2的元素交换。
元素是1和3,所以不要交换。
[2, 1, 3, 4]
随机数为2,与位置3的元素交换。
[2, 1, 4, 3]
等
如果您想概括约束,则只需更改条件即可。 您可以确保要交换位置上的两个元素彼此之间不在2个之内,而不是在元素分别为1和3或2和4时拒绝交换(如上例所示)。 if(b==a+2)continue;
:
元素是5和7,所以不要交换。
if(7==5+2)continue; // ie don't swap.
如果将其用作字符串,则可以使用此答案的算法交换所有数字
输入所有数字后,只需将它们连接在一起即可。 无需将它们视为数字或字符串。 您要做的就是重新排序它们。
得到结果后,可以检查约束条件是否匹配,然后打印出另一个列表。 像这样的东西
private boolean isConstraintSatisfied(String wholeString, String firstNum, String secondNum){
return wholeString.indexOf(firstNum) <= wholeString.indexOf(secondNum);
}
不是最优雅的解决方案,但我认为它会起作用。 对于小的输入集,它应该不会太低效。
您在此处定义的称为部分订单 。 您希望生成一个仍满足部分顺序的随机排列,即随机线性扩展。
幸运的是,Java API指定了Collections.shuffle
,它实现了Fisher-Yates算法来生成随机排列。 不幸的是,通过Collections.sort
的标准Java技术是一种比较sort ,因此专注于总订单-与我们想要的部分订单不同。 实际上,Java API缺乏我们可以在此处使用的排序算法。
“通过转置生成Poset的线性扩展”中介绍的一种方法涉及以类似于Hassan解决方案的方式交换集合中的相邻元素。 这似乎是解决本地化问题的有效方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.