好吧所以我是ArrayList的新手,我想做的是制作一个程序,从一副54张卡中获得3张随机卡,没有任何重复。我不知道在我的if循环中放什么。请帮忙
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.ArrayList;
public class card_ran1 extends JFrame
{
public card_ran1()
{
ArrayList<Integer> Ran = new ArrayList<Integer>();
setLayout(new GridLayout(1,4,5,5));
Random random = new Random();
int i = random.nextInt(54) + 1 ;
int n = random.nextInt(54) + 1 ;
int m = random.nextInt(54) + 1 ;
Ran.add(i);
if (Ran.contains(n))
{
//what should go here
}
if (Ran.contains(m))
{
//what should go here
}
add(new JLabel(new ImageIcon("card/" + Ran.get(0) + ".png")));
add(new JLabel(new ImageIcon("card/" + Ran.get(1) + ".png")));
add(new JLabel(new ImageIcon("card/" + Ran.get(2) + ".png")));
}
public static void main(String[] args)
{
card_ran1 frame = new card_ran1();
frame.setTitle("Random Cards");
frame.setSize(600,300);
frame.setLocationRelativeTo( null );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setVisible( true );
}
}
答案 0 :(得分:8)
如果值是唯一的,请使用Set
,而不是List
。
Set<Integer> set = new LinkedHashSet<Integer>(); // order is preserved
使用循环获得3个不同的值:
while (set.size() < 3)
set.add(random.nextInt(54) + 1);
如果您确实需要List
,请使用复制构造函数:
List<Integer> list = new ArrayList<Integer>(set);
整个过程只需几行代码即可完成。
答案 1 :(得分:3)
至于您的问题,您可以使用以下方法删除项目(或您的案例中的卡片): http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#remove(int)
至于循环,我不完全确定你想要完成什么。如果您决定创建一个循环并选择您的卡,然后在每次迭代中将其删除,那么它将起作用。目前,您将无法从卡组中正确删除卡,因为当您删除第一个时,由于ArrayList缩小的大小,它们的索引将不正确。在循环外创建变量,这样就不会丢失信息。
答案 2 :(得分:1)
提示:
ArrayList
中。所以使用循环!您也可以使用Set,它不允许重复...但是存在不保留随机选择的“卡”顺序的问题。如果您需要保留订单,请使用LinkedHashSet
。
您的代码中存在许多样式错误:
Java类名称应为“camel case”,以大写字母开头。在此基础上,test_ran1
应为TestRan1
。
Java变量名称应为“camel case”。在此基础上,Ran
应为ran
。
可爱的缩写是一个坏主意,尤其是在类名中。名称应为TestRandom
。
你的代码缩进是一团糟。根据代码的块结构,您应该始终缩进相同数量的空格。看看其他例子。
(如果要标记此代码,您的标记应该标记您这些东西!如果我设置了标记方案,您将失去所有代码的样式标记看起来像那样!)