与Java中的Arraylist不重复

时间:2013-08-29 01:19:26

标签: java arraylist

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

3 个答案:

答案 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

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

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