[英]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.