【发布时间】:2017-07-04 16:21:07
【问题描述】:
我自己试过这个,到处寻找答案,似乎找不到合适的解决方法。我之前在这个网站上找到了很多答案,所以我注册问我的问题。我有一个程序可以循环 6 个用户并将他们分配到一个位置。用户:Alpha、bravo、charlie、delta、echo 和 frank。位置:1,2,3,4,5,6。我正在生成随机数以将用户分配到他们的位置。我有一条要检查的规则;任何用户都不能被分配到同一个位置两次。由于此规则以及用户对站点的随机分配,有时位置 6 的唯一用户是在先前轮换中已被分配到位置 6 的用户。当这种情况发生时,我的程序崩溃了,这是理所当然的。我该如何克服呢?我有一些程序会做出正确选择的例子,我有 6 次成功的轮换。我希望每次都有 6 次成功的轮换。我花了两周时间试图弄清楚这一点。我能得到的任何帮助将不胜感激。谢谢你。我在下面粘贴了我的代码。我正在使用 Java。
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Color;
import java.awt.CardLayout;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
public class test extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
test frame = new test();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
//TODO
int randnum[] = new int [7];
int numOfRotations = 1;
String[] String_CurrentOperator = new String[7];
Random rand_opers = new Random();
List<Integer> ArrayList_UsedRandNums = new ArrayList<>();
List<List<String>> ArrayList_MainOperatorHistory = new ArrayList<List<String>>();
List<String> ArrayList_AllOpers = new ArrayList<>();
List<String> ArrayList_UsedOpers = new ArrayList<>();
List<String> ArrayList_OperatorHistory1 = new ArrayList<>();
List<String> ArrayList_OperatorHistory2 = new ArrayList<>();
List<String> ArrayList_OperatorHistory3 = new ArrayList<>();
List<String> ArrayList_OperatorHistory4 = new ArrayList<>();
List<String> ArrayList_OperatorHistory5 = new ArrayList<>();
List<String> ArrayList_OperatorHistory6 = new ArrayList<>();
public test() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBackground(Color.DARK_GRAY);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new CardLayout(0, 0));
JButton btnShuffle = new JButton("SHUFFLE");
contentPane.add(btnShuffle, "name_253561263644851");
btnShuffle.addActionListener(this);
ArrayList_AllOpers.add("POSITION ZERO");
ArrayList_AllOpers.add("Alpha");
ArrayList_AllOpers.add("Bravo");
ArrayList_AllOpers.add("Charlie");
ArrayList_AllOpers.add("Delta");
ArrayList_AllOpers.add("Echo");
ArrayList_AllOpers.add("Frank");
ArrayList_MainOperatorHistory.add(ArrayList_OperatorHistory1);
ArrayList_MainOperatorHistory.add(ArrayList_OperatorHistory1);
ArrayList_MainOperatorHistory.add(ArrayList_OperatorHistory2);
ArrayList_MainOperatorHistory.add(ArrayList_OperatorHistory3);
ArrayList_MainOperatorHistory.add(ArrayList_OperatorHistory4);
ArrayList_MainOperatorHistory.add(ArrayList_OperatorHistory5);
ArrayList_MainOperatorHistory.add(ArrayList_OperatorHistory6);
}
public void actionPerformed(ActionEvent arg0) {
/*******************************
*****ASSIGN ALL OPERATORS******
*******************************/
System.out.println("THIS IS ROTATION "+numOfRotations);
genRandoms();
for(int i=1; i<6+1; i++){
do{
//randnum[i] = rand_opers.nextInt(6)+1;
String_CurrentOperator[i] = ArrayList_AllOpers.get(randnum[i]);
}
while(ArrayList_UsedOpers.contains(String_CurrentOperator[i]) || ArrayList_MainOperatorHistory.get(i).contains(String_CurrentOperator[i]));
ArrayList_UsedOpers.add(String_CurrentOperator[i]); //add to used names thus far
}
for(int i=1; i<6+1; i++){
System.out.println(String_CurrentOperator[i]); //Prints the name of the operator working on the station
ArrayList_MainOperatorHistory.get(i).add(String_CurrentOperator[i]); //adds operator to list of all users who have been assigned to this station
}
//Perform cleanup actions for next iteration of the loop
numOfRotations++; //increment the rotation count by 1
ArrayList_UsedRandNums.clear(); //clear the list of randum numbers used
ArrayList_UsedOpers.clear(); //clear the list of assigned operators
System.out.println("");
}
public void genRandoms(){
for(int i=1; i<6+1; i++){
do{
randnum[i] = rand_opers.nextInt(6)+1;
}
while (ArrayList_UsedRandNums.contains(randnum[i]));
ArrayList_UsedRandNums.add(randnum[i]); //add randnum[i] to list of random numbers used thus far
}
}
}
【问题讨论】:
-
shuffle在Collections中有两个变体。你能用那个吗? docs.oracle.com/javase/6/docs/api/java/util/Collections.html -
什么是
ArrayList_AllOpers.add("POSITION ZERO");?看起来您正试图避免数组从零开始的性质。不要,你需要接受它。 -
哇,所有这些回复都已经很棒了!惊人的。我会查看并尝试它们并报告回来。非常感谢!韦斯顿你是对的。这次我故意尽量避免零基础的性质。不过,我倾向于更频繁地接受它。
标签: java loops random do-while