我有一个JButtons数组,其中String文件名设置为文本(有点难以解释,但文件名指定图像,所以当我想为特定按钮设置图标时,我有一个方法可以拉按钮中的文件名文本并将其用于setIcon)。 String文件名存储在一个String数组中,我试图改变Strings,但问题是当我运行我的程序时,文件名没有被正确地洗牌。它们有随机位置,但我有24对匹配的文件名,每次运行时匹配的文件名总是3个按钮,这显然不是随机的。有谁知道为什么会这样?我怀疑这是我的setFace方法的问题,因为我正在使用混洗数组..帮助将不胜感激!
public void shuffle()
{
for(int i = 0; i < 24; i++)
{
int rand = (int)(Math.random() * 24);
temp[i] = country[rand]; //temp is a temporary array
country[rand] = country[i];//country is the filename array
country[i] = temp[i];
}
card.setBack(cards);
card.setFace(country, cards); //cards is the 48 button array
}
public void setFace(String[] file, JButton[] buttons) //filename method
{
for(int i = 0; i < 24; i++)
{
buttons[i].setText(file[i]);
}
int ct = 0;
for(int x = 24; x < 48; x++)
{
buttons[x].setText(file[ct]);
ct++;
}
}
public void setBack(JButton[] array) //sets back icon of card
{
icon = new ImageIcon(this.getClass().getResource("back.png"));
img = (icon.getImage().getScaledInstance(75, 95, java.awt.Image.SCALE_SMOOTH));
thomas = new ImageIcon(img);
for(int x = 0; x < array.length; x++)
{
array[x].setIcon(thomas);
}
}
我所说的非随机安排是这样的:
Card A Card R
Card D Card H
Card F Card Z
Card A Card R
Card D Card H
Card F Card Z
答案 0 :(得分:1)
如果你想以随机顺序显示一组元素并使用每个元素两次,你有几种方法可以做到:
1。)创建元素的数组/列表,并将每个元素添加两次然后随机播放并显示它(在您的情况下设置按钮文本)。
2。)创建元素列表并添加两个元素。然后迭代按钮并从列表中提取随机元素(删除它)。你可以这样做:
List<String> elements = ...;//create the list, like A,A,B,B,C,C etc.
Random r = new Random();
for( JButton b : buttons ) {
//get a random element
int index = r.nextInt( elements.size() ); //index is between 0 and list size exclusive
String element = elements.remove( index ); //remove the element which returns it as well
b.setText( element );
}
3。)不这样做。 2但迭代元素并选择2个随机按钮:
List<JButton> buttons = ...; //temporary list of buttons
Random r = new Random();
for( String element : elements ) {
//remove a random button from the list and assign it the text
buttons.remove( r.nextInt( buttons.size() ) ).setText(element);
buttons.remove( r.nextInt( buttons.size() ) ).setText(element);
}