在Java中使用Arraylist不重复

在Java中使用Arraylist不重复,java,arraylist,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<

好的,我是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 );
    }
}
import javax.swing.*;
导入java.awt.*;
导入java.util.*;
导入java.util.ArrayList;
公共类卡\u ran1扩展JFrame
{
公共卡1()
{
ArrayList Ran=新建ArrayList();
setLayout(新网格布局(1,4,5,5));
随机=新随机();
int i=random.nextInt(54)+1;
int n=random.nextInt(54)+1;
int m=random.nextInt(54)+1;
加入(i);
if(Ran.contains(n))
{
//这里应该放什么
}
if(Ran.contains(m))
{
//这里应该放什么
}
添加(新的JLabel(新的图像图标(“card/”+Ran.get(0)+.png));
添加(新的JLabel(新的图像图标(“card/”+Ran.get(1)+.png));
添加(新的JLabel(新的图像图标(“card/”+Ran.get(2)+.png));
}
公共静态void main(字符串[]args)
{
card_ran1 frame=新卡_ran1();
frame.setTitle(“随机卡片”);
框架尺寸(600300);
frame.setLocationRelativeTo(空);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
提示:

  • 每次你得到一个新的随机数时,它可能已经在
    数组列表中了。所以使用循环
    
你也可以使用一个不允许重复的集合。。。但这有一个问题,那就是不能保持随机选择的“卡片”的顺序。如果需要保留订单,请使用
LinkedHashSet


代码中存在许多样式错误:

  • Java类名应该是以大写字母开头的“驼峰大小写”。在此基础上,
    test\u ran1
    应该是
    TestRan1

  • Java变量名应该是“camel-case”。在此基础上,
    Ran
    应该是
    Ran

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

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

(如果要标记此代码,您的标记器应该为您标记这些内容!如果我设置了标记方案,您将丢失类似代码的所有样式标记!)

提示:

  • 每次你得到一个新的随机数时,它可能已经在
    数组列表中了。所以使用循环
    
你也可以使用一个不允许重复的集合。。。但这有一个问题,那就是不能保持随机选择的“卡片”的顺序。如果需要保留订单,请使用
LinkedHashSet


代码中存在许多样式错误:

  • Java类名应该是以大写字母开头的“驼峰大小写”。在此基础上,
    test\u ran1
    应该是
    TestRan1

  • Java变量名应该是“camel-case”。在此基础上,
    Ran
    应该是
    Ran

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

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


(如果要标记此代码,您的标记器应该为这些内容标记您!如果我设置标记方案,您将丢失类似代码的所有样式标记!)

如果值是唯一的,请使用
集,而不是
列表

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


整个过程只需几行代码即可完成。

如果值是唯一的,请使用
集合,而不是
列表

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


整个过程只需几行代码即可完成。

至于您的问题,您可以使用以下方法删除项目(或卡片):


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

对于您的问题,您可以使用以下方法删除项目(或卡片):


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

我认为应该使用
do{…}while(…)而不是
if
,因为你想一直尝试获得一张新卡,直到你得到一张不重复的卡。另一种方法是洗牌,然后取前3张卡。我同意@NormR,
Collections。洗牌之后是
子列表(0,3)
。为什么不使用Set而不是ArrayList,这将确保不会有重复。@JjTuibeo-从牌组中抽取牌的顺序可能非常重要。大多数
Set
实现并不表示插入顺序而不是
if
,因为您希望一直尝试获取新卡,直到获得新卡为止
List<Integer> list = new ArrayList<Integer>(set);