本帖最后由 rockybull 于 2015-12-17 18:33 编辑
集合体系:单列集合和双列集合
单列集合顶层接口Collection
一、List 有序(存取一致) 可重复
ArrayList 数组,查询快,增删慢,不安全,高。
Vector 数组,查询快,增删慢,安全,低。
LinkedList 链表,查询慢,增删快,不安全,高。
二、Set 无序,唯一
HashSet 哈希算法,不安全,高。
如何保证元素的唯一性?
依赖于两个方法:hashCode(),equals()
TreeSet 二叉树,不安全,高
如何保证元素的唯一性?
A:自然排序。
Comparable,compareTo()
B:比较器接口。
Comparator,compare()
双列集合顶层接口Map
HashMap 哈希算法,不安全,高。
TreeMap 二叉树,不安全,高
总结:一、Collection 和 Map 的区别:
Collection:单列集合的顶层接口, 数据结构针对元素有效,它的Set体系具有唯一性。
Map:双列,键,键是唯一的。
Collection 和 Collections
Collection :单列集合的顶层接口, 数据结构针对元素有效,它的Set体系具有唯一性。
Collections :操作单列集合的工具类。
二、HashMap 和 Hashtable 的区别:
HashMap: JDK1.2,线程不安全,效率高。可以存null值和键
Hashtable: JDK1.0 线程安全,效率低。不可以存null值和键
到底使用那种集合
看需求。
看用单列还是双列:
单列:Collection
看是否唯一:
是:Set
看是否排序:
是:TreeSet
否:HashSet
需求不明确,用HashSet
否:List
看增删多还是查询多:
增删多:LinkedList
查询多:ArrayList
需求不明确,用ArrayList
双列:Map:
看是否排序:
是:TreeMap
否:HashMap
需求不明确,用HashMap
集合的遍历主要就是增强for和迭代器。
HashSet和HashMap保证唯一是通过重写equals()和hashCode()方法。
TreeSet和TreeMap排序是通过自然排序和比较器接口排序。
斗地主洗牌用集合实现
package com.heima.set;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.TreeSet;
public class Test { //定义一个类
public static void main(String[] args) {
String[] num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //定义数组按顺序存储花色和除了大小王的牌。
String[] color={"♥","♠","♣","♦"};
HashMap<Integer, String> hm=new HashMap<>(); //定义双列集合存花色和牌
ArrayList<Integer> list=new ArrayList<>(); //定义单列集合存用来洗牌的索引。
int index=0 ; //用增强for添加牌到双列集合中,同时单列集合list增加索引
for (String s : num) {
for (String s1 : color) {
hm.put(index, s1+s);
list.add(index);
index++;
}
}
hm.put(index, "小王");
list.add(index);
index++;
hm.put(index, "大王");
list.add(index);
Collections.shuffle(list); //洗牌,打乱索引
TreeSet<Integer> gaoJin=new TreeSet<>(); //发牌,定义四个集合,包括三个玩家和底牌。
TreeSet<Integer> longWu=new TreeSet<>();
TreeSet<Integer> xyp=new TreeSet<>();
TreeSet<Integer> diPai=new TreeSet<>();
for(int i=0;i<list.size();i++) {
if(i>list.size()-4) {
diPai.add(list.get(i));
}
else if(i%3==0){
gaoJin.add(list.get(i));
}
else if(i%2==1) {
longWu.add(list.get(i));
}
else {
xyp.add(list.get(i));
}
}
lookPoker(hm, xyp, "xyp"); //分别调用看牌方法输出玩家和底牌的牌。
lookPoker(hm, gaoJin, "高进");
lookPoker(hm, longWu, "龙五");
lookPoker(hm, diPai, "底牌");
}
//看牌方法,传入54张牌的集合和玩家和底牌的索引集合,和玩家姓名。
public static void lookPoker(HashMap<Integer,String> hs,TreeSet<Integer> ts,String name) {
System.out.println(name+"的牌是:");
for (Integer in : ts) {
System.out.print(hs.get(in)+" ");
}
System.out.println();
}
}
//运行结果
|
|