当我输入一个整数列表时,如何生成另一个随机顺序但带有约束条件?
例如,我将整数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、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, 2, 3, 4]
随机数为0,与位置1的元素交换。
[2, 1, 3, 4]
随机数为1,与位置2的元素交换。[2, 1, 3, 4]
随机数为2,与位置3的元素交换。
[2, 1, 4, 3]
等等。if(b==a+2)continue;
:if(7==5+2)continue; // ie don't swap.
Collections.shuffle
,它实现了Fisher-Yates算法以生成随机排列。
不幸的是,标准Java技术通过Collections.sort
是一种比较排序,因此专注于全序 - 不像我们想要的偏序。 实际上,Java API缺少我们可以在此处使用的排序算法。
"通过转置产生偏序的线性扩展"中涵盖的一种方法涉及以类似于 Hassan 的解决方案的方式交换集合中相邻元素。这似乎是解决手头局部问题的一种有效方式。
如果您将其用作字符串,则可以使用this答案的算法来交换所有数字
当您输入所有数字时,只需将它们连接在一起即可。没有必要将它们视为数字或字符串。您想要做的就是重新排序它们。
当您获得结果后,可以检查您的约束是否匹配,然后打印出另一个列表。可能会像这样:
private boolean isConstraintSatisfied(String wholeString, String firstNum, String secondNum){
return wholeString.indexOf(firstNum) <= wholeString.indexOf(secondNum);
}
虽然不是最优雅的解决方案,但我认为它应该能够工作。对于小型输入集,效率不会太低。