集合的基本概念
在实际处理问题的时候,因为很多因素都不确定,而数组的长度又是固定的,所以数组的长度就不好控制了,数组的容量小了,就会造成数组越界异常,数组的容量大了,就会造成空间的浪费!为了避免这些问题,集合的使用就十分重要了。集合按照其存储结构可以分为两大类,一类是单列集合Collection,一类是双列集合Map。这里使用的是Collection的实现类ArrayList类。ArrayList类是Collection的子接口List的实现类。
问题描述:
1.创建Card类,定义花色suit和点数rank的属性
2.添加相应的构造方法
3.在Card中覆盖toString,hashCode,equals方法 (必须写)
4.创建玩家类 Player类 ,定义名字name ,手牌 cards (List) 5.添加相应的构造方法
6.在Player中覆盖toString,hashCode,equals方法 (必须写)
7.创建一副扑克牌,54张(到这)
8.实现洗牌(查看API选做)
9.实现轮流发牌
最终结果需要看到XXX手上的牌:[XXX,XXXX,XXXX…]
Card类的实现
Card类,用来保存牌的具体牌面信息,比如牌的花色,点数。重写toString方法
public class Card {
//定义花色
private char suit;
private String rank;
//有参构造方法
public Card(char suit, String rank) {
super();
this.suit = suit;
this.rank = rank;
}
//生成无参构造构造方法
public Card() {
}
//生成getter和setter方法
public char getSuit() {
return suit;
}
public void setSuit(char suit) {
this.suit = suit;
}
public String getRank() {
return rank;
}
public void setRank(String rank) {
this.rank = rank;
}
//重写toString方法
public String toString() {
return "["+suit + rank + "]";
}
//重写hashCode方法
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + suit;
return result;
}
//重写equals
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Card other = (Card) obj;
if (rank != other.rank)
return false;
if (suit != other.suit)
return false;
return true;
}
}
Player类的实现
public class Player {
// 定义一个姓名
private String name;
// 定义一个card集合
private List<Card> cards = new ArrayList<Card>();
// 有参构造方法
public Player(String name) {
super();
this.name = name;
}
// 无参构造方法
public Player() {
super();
}
// name的getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Card> getCards() {
return cards;
}
public void setCards(List<Card> cards) {
this.cards = cards;
}
// 重写toString方法
public String toString() {
// 定义一个字符串用来保存拼接Cards集合中的所有牌的信息
String showCards="All of card:";
// 遍历集合,拼接所有card信息
for (Card card : cards) {
showCards+= card.toString();
}
return "Player [name=" + name + ", " + showCards + "]";
}
// 重写hashCode方法
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
// 重写equals方法
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Player other = (Player) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
测试类的实现
测试类中定义有生成一副扑克牌的方法,实现洗牌,以及轮流发牌的操作
public class Test {
public static void main(String[] args) {
//创建一副扑克牌
List <Card> cards= createCards();
//洗牌
Collections.shuffle(cards);
//发牌创建玩家
List <Player>players=new ArrayList <Player> (3);
//添加三个玩家
for(int i=0;i<3;i++) {
players.add(new Player("玩家"+i));
}
//获取cards迭代器,在遍历cards时使用
Iterator it=cards.listIterator(3);
//创建一个计数器变量,用来控制给三个人轮流发牌
int count=0;
//遍历cards,将牌轮流发给三个玩家
while(it.hasNext()) {
players.get(count).getCards().add((Card) it.next());
count++;
if(count==3) {
count=0;
}
}
//打印每个玩家的手牌以及底牌
System.out.println(players.get(0).toString());
System.out.println(players.get(1).toString());
System.out.println(players.get(2).toString());
System.out.print("底牌:"+cards.get(0).toString()+cards.get(1).toString()+cards.get(2).toString());
}
//定义一个用来生成54张牌的方法
private static List<Card> createCards() {
//创建一个集合用来保存一副扑克牌
List <Card> cards=new ArrayList<Card>();
//字符串存放所有种类的花色
String suits="♥♠♣♦";
//字符串数组存放所有点数
String [] ranks= {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
//利用双重循环生成各种花色点数的扑克牌,并将其存放在集合中
for(int i=0;i<suits.length();i++) {
for(int j=0;j<ranks.length;j++) {
Card card=new Card();
card.setSuit(suits.charAt(i));
card.setRank(ranks[j]);
cards.add(card);
}
}
//单独存放大小王
Card card1=new Card();
card1.setSuit('大');
card1.setRank("boss");
Card card2=new Card();
card2.setSuit('小');
card2.setRank("boss");
cards.add(card1);
cards.add(card2);
//将集合返回
return cards;
}
}
这里的斗地主只实现到给每个玩家发牌,并留下底牌,抢地主以及后面具体的打牌还未实现。对于集合的选用,使用ArrayList的原因是因为ArrayList集合适合用于快速随机访问元素。