1

好的,所以我是 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 );
    }
}
4

3 回答 3

8

如果值是唯一的,请使用 a Set,而不是 a List

Set<Integer> set = new LinkedHashSet<Integer>(); // order is preserved

使用循环获取 3 个不同的值:

while (set.size() < 3)
    set.add(random.nextInt(54) + 1);

如果您真的需要 a List,请使用复制构造函数:

List<Integer> list = new ArrayList<Integer>(set);

整个事情只需几行代码就可以完成。

于 2013-08-29T01:39:03.393 回答
3

至于您的问题,您可以使用以下方法删除项目(或卡):http: //docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html#remove(诠释)

至于循环,我不完全确定您要完成什么。如果您决定创建一个循环并选择您的卡片,然后在每次迭代中将其移除,那么它将起作用。目前,您将无法正确地从牌组中移除卡片,因为当您移除第一张卡片时,它们的索引将不正确,因为 ArrayList 的大小会缩小。在循环外创建变量,以免丢失信息。

于 2013-08-29T02:03:23.810 回答
1

提示:

  • 每次你得到一个新的随机数,它可能已经在ArrayList. 所以使用循环!

你也可以使用一个不允许重复的集合......但它的问题是不保留随机选择的“卡片”的顺序。如果您需要保留订单,请使用LinkedHashSet.


您的代码中有许多样式错误:

  • Java 类名应该是“驼峰式”,以大写字母开头。在此基础上,test_ran1TestRan1

  • Java 变量名应该是“驼峰式”。在此基础上,Ranran

  • 可爱的缩写是个坏主意,尤其是在类名中。名字应该是TestRandom

  • 您的代码的缩进是一团糟。您应该根据代码的块结构一致地缩进相同数量的空格。看看其他例子。

(如果要标记此代码,您的标记应该标记您的这些东西!如果我正在设置标记方案,您将丢失看起来像这样的代码的所有样式标记!)

于 2013-08-29T01:38:02.153 回答