ArrayList简单的洗牌算法
ArrayList简介
在集合框架中,
ArrayList
是一个普通的类,实现了
List
接口
1. ArrayList
是以泛型方式实现的,使用时必须要先实例化
2. ArrayList
实现了
RandomAccess
接口,表明
ArrayList
支持随机访问
3. ArrayList
实现了
Cloneable
接口,表明
ArrayList
是可以
clone
的
4. ArrayList
实现了
Serializable
接口,表明
ArrayList
是支持序列化的
5.
和
Vector
不同,
ArrayList
不是线程安全的,在单线程下可以使用,在多线程中可以选择
Vector
或者 CopyOnWriteArrayList
6. ArrayList
底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
ArrayList的构造
ArrayList常见操作
ArrayList虽然提供的方法比较多,但是常用方法如下所示
方法
| 解释 |
boolean add(E e) | 尾插 e |
void add(int index, E element) | 将 e 插入到 index 位置 |
boolean addAll(Collection<? extends E> c) | 尾插 c 中的元素 |
E remove(int index) | 删除 index 位置元素 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) |
获取下标
index
位置元素
|
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List<E> subList(int fromIndex, int toIndex) | 截取部分 list |
简单的洗牌算法
代码分为两部分,牌的初始化和洗牌
牌的初始化:
package demo;
public class Card {
private String suit;//花色
private int rank;//扑克的数字
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return "花色:" + suit + "数字:" + rank ;
}
public String getSuit() {
return suit;
}
public void setSuit(String suit) {
this.suit = suit;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
}
洗牌:
package demo;
import com.sun.org.apache.bcel.internal.generic.SWAP;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class CardList {
//先定义花色数组,花色是常量
private static final String[] SUIT={"♦","♣","♠","♥"};//被final修饰后大写
//买牌
public static List<Card> BuyCards(){
List<Card> list=new ArrayList<>();
for (int i = 0; i < SUIT.length; i++) {
for (int j = 0; j < 13; j++) {
Card card=new Card(SUIT[i],j);
list.add(card);
}
}
return list;
}
public static void SWAP(List<Card> list,int i,int j) {
Card tmp=list.get(i);
list.set(i,list.get(j));
list.set(j,tmp);
}
//洗牌
public static void shuffle(List<Card> list) {
Random random=new Random();
//从后往前生成随机数
for (int i = list.size()-1; i > 0; i--) {
int index= random.nextInt(i);
SWAP(list,index,i);
}
}
public static void main(String[] args) {
List<Card> list=BuyCards();
System.out.println(list);
System.out.println("洗过的牌");
shuffle(list);
System.out.println(list);
//三个人,每人轮流抓5张牌
//一人5张牌,三个人,所以要用二维数组来写
List<List<Card>> hand=new ArrayList<>();
List<Card> hand1=new ArrayList<>();
List<Card> hand2=new ArrayList<>();
List<Card> hand3=new ArrayList<>();
//把他们串起来,加进去
hand.add(hand1);
hand.add(hand2);
hand.add(hand3);
//控制次数
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
//每次揭牌都是0下标的牌,因为每次揭走就被删除了
Card card=list.remove(0);
hand.get(j).add(card);
}
}
//查看三个人揭到的牌
System.out.println("第一个人的牌:"+hand.get(0));
System.out.println("第一个人的牌:"+hand.get(1));
System.out.println("第一个人的牌:"+hand.get(2));
System.out.println("剩下的牌:"+list);
}
}
结果: