在Java中使用Arraylist不重复
好的,我是ArrayList的新手,我想做的是制作一个程序,从54张牌中随机抽取3张牌,没有任何重复。我不知道在我的if循环中放什么。请帮忙在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<
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);