Collection(接口):单列
|--List(接口):1.有序的;2.可以存储重复值;
|--ArrayList(类):数组实现;不同步的,效率高;
|--Vector(类):数组实现;同步的,效率低;
|--LinkedList(类):链表实现;不同步的,效率高;
|--Set(接口):1.无序的;2.不能存储重复值;(全是不同步的)
|--HashSet(类):哈希表实现;验证重复:hashCode()和equals()
|--LinkedHashSet(类):链表,哈希表实现;链表:有序;哈希表:唯一
|--TreeSet(类):树结构;唯一性验证:比较的方法compareTo()或者compare()方法如果返回0,就不存;
对元素排序的:
1.自然排序:
1).存储的对象必须实现Comparable接口
2).重写compareTo()方法;
2.比较器排序:
1).自定义比较器,实现Comparator接口
2).重写compare()方法;
3).实例化TreeSet对象时,传递自定义比较器的对象;(一般我们使用匿名内部类的方式)
Map(接口):双列集合
|--HashMap(类):"键"使用的"哈希表"结构;
|--LinkedHashMap(类):"键"使用的"链表、哈希表"结构;
|--TreeMap(类):"键"使用的"树"结构;
|--Hashtable(类):哈希表。同步的,效率低;
数据结构:
栈:后进先出;
队列:先进先出;
数组:查询快;增、删慢;
链表:查询慢;增、删快;
哈希表:综合了数组和链表的优点,查询、增、删都快。效率取决于"哈希算法";
树:对元素排序。
我们该怎样选择集合呢?
1.单列or双列:
1):单列:Collection:-->有序or无序
1)有序:List:--> 是否经常增、删?
1).是:LinkedList:
2).否:ArrayList_or_Vector:是否多线程访问:
1)是:Vector
2)否:ArrayList
2)无序:Set:--> 是否要排序?
1).是:TreeSet
2).否:HashSet
LinkedHashSet 和 ArrayList:建议使用ArrayList
2):双列:Map:-->是否排序?
1).是:TreeMap
2).否:HashMap
遍历集合的方式:
Collection:
1).toArray():
2).iterator():
3).增强for():(最常用)
|--List:
4).get():
5).ListIterator():
|--Set:
(无)
Map:
1).keySet:
2).entrySet:
通过以上知识可以模拟斗地主的洗牌发牌的过程,如下:
package cn.itcast.demo12_模拟斗地主洗牌和发牌_对牌进行排序;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) {
//1.封装一副牌
String[] color ={"♥","♠","♦","♣"};
String[] number =
{"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
HashMap pokerMap = new HashMap<>();//牌
面和编号的映射关系
ArrayList pokerIndex = new ArrayList<>();
int index = 1;
for(String n : number){
for(String c : color){
pokerMap.put(index, c + n);
pokerIndex.add(index);
index++;
}
}
pokerMap.put(index, "小王");
pokerIndex.add(index);
index++;
pokerMap.put(index, "大王");
pokerIndex.add(index);
//洗牌:洗的编号
Collections.shuffle(pokerIndex);
//发牌:发编号
TreeSet user1Set = new TreeSet<>();
TreeSet user2Set = new TreeSet<>();
TreeSet user3Set = new TreeSet<>();
TreeSet dipaiSet = new TreeSet<>();
for(int i = 0 ;i < pokerIndex.size() ; i++){
if(i >= pokerIndex.size() - 3){
dipaiSet.add(pokerIndex.get(i));
}else{
if(i % 3 == 0){
user1Set.add(pokerIndex.get(i));
}else if(i % 3 == 1){
user2Set.add(pokerIndex.get(i));
}else if(i % 3 == 2){
user3Set.add(pokerIndex.get(i));
}
}
}
//看牌
System.out.print("玩家1:【");
for(Integer n : user1Set){
System.out.print(pokerMap.get(n) + ", ");
}
System.out.println("】");
System.out.println();
System.out.print("玩家2:【");
for(Integer n : user2Set){
System.out.print(pokerMap.get(n) + ", ");
}
System.out.println("】");
System.out.println();
System.out.print("玩家3:【");
for(Integer n : user3Set){
System.out.print(pokerMap.get(n) + ", ");
}
System.out.println("】");
System.out.println();
System.out.print("底牌:【");
for(Integer n : dipaiSet){
System.out.print(pokerMap.get(n) + ", ");
}
System.out.println("】");
System.out.println();
}
}