字典 Map 存键值对
/
HashMap <K,V> LinkedHashMap<K,V>
数组+链表 数组+双链表(有序)
自定义键对象(不能重)需要重写键的hashCode()方法、equals()方法。
Map
import java.util.Map;
import java.util.Set;
public class Demo01 {
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put("a","12"); //添加
map.put("b","1");
map.put("a","2");//覆盖a的值
System.out.println(map);//{a=2,b=1} 无顺序
//String v=map.remove("b");//删除键的值 返回
//System.out.println(v);
System.out.println(map.get("a"));//取值 没有返回null
// 通过keyset遍历map 增强for
// Map不能直接用 迭代器/增强for 遍历 需要转Set才能用
Set<String> keys=map.keySet(); // 返回集合中所有键
for(String key:keys){
String value=map.get(key); // 获取键的值
System.out.println(key+"..."+value);
}
//通过Iterater
Set<String> keys2=map.keySet();
Iterator<String> it=keys2.iterator();
while(it.hasNext()){
String key=it.next();
String value=map.get(key);
System.out.println(key+"..."+value));
}
//增强for + entrySet方法(键值对对象)
Set<Map.Entry<String,String>> entrys=map.entrySet();
for(Map.Entry<String,String> entry:entrys){
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+"..."+value);
}
//Iterater遍历
Set<Map.Entry<String,String>> entrys2=map.entrySet();
Iterator<Map.Entry<String,String>> it2=entrys.iterator();
while(it2.hasNext()){
Map.Entry<String,String> entry2=it2.next();
String key2=entry2.getKey();
String value2=entry2.getValue();
System.out.println(key2+"..."+value2);
}
}
}
Map<Student,String> map = new HashMap<Student,String>();//键内容不重
map.put(new Student("lisi",28), "上海");// Student重写HashCode()、equals()
多层字典
HashMap<String,HashMap<String,Person>> oracle
=new HashMap<String,HashMap<String,Person>>();
HashMap<String,Person> java0601=new HashMap<String,Person>();
java0601.put("001", new Person("小红帽",18));
java0601.put("002", new Person("小丸子",20));
HashMap<String,Person> java0929=new HashMap<String,Person>();
java0929.put("001", new Person("张超",22));
java0929.put("002", new Person("赵玉仙",21));
oracle.put("java0601", java0601);
oracle.put("java0929", java0929);
//遍历 增强for+keyset
Set<String> classes=oracle.keySet();//所有键 集合 班级名字集合
for(String clas:classes){
HashMap<String,Person> c=oracle.get(clas);//获取班级集合 值
Set<String> stunumbers=c.keySet(); // 人名集合 键
for(String num:stunumbers){
Person p=c.get(num); //人名集合 值
System.out.println("班级"+clas+"学号"+num+"学生"+p);
}
}
斗地主 发牌 例子
public static void main(String[] args) { //准备容器 //牌序 牌值 HashMap<Integer,String> pookerMap=new HashMap<Integer,String>(); ArrayList<Integer> pookerNumer=new ArrayList<Integer>(); //牌序 //准备牌 String[] number={"2","A","K","Q","J","10","9","8","7","6","5","4","3"}; String[] color={"♥","♦","♣","♠"}; int index=2; for(String num:number){ for(String col:color){ pookerMap.put(index, col+num);//向Map中添加 牌序:牌值 pookerNumer.add(index); //向ArrayList添加 牌序号 index++; } } //添加大小王 pookerMap.put(0,"大王"); pookerNumer.add(0); pookerMap.put(1,"小王"); pookerNumer.add(1); System.out.println(pookerMap); //洗牌、发牌 Collections.shuffle(pookerNumer); //打乱 ArrayList 牌序号 ArrayList<Integer> player1=new ArrayList<Integer>(); ArrayList<Integer> player2=new ArrayList<Integer>(); ArrayList<Integer> player3=new ArrayList<Integer>(); ArrayList<Integer> bottom=new ArrayList<Integer>(); for(int i=0;i<pookerNumer.size();i++){ //分发 牌序号 if(i<3){bottom.add(pookerNumer.get(i));} // 前三个序号 添加 底牌 else if(i%3==0){player1.add(pookerNumer.get(i));} else if(i%3==1){ player2.add(pookerNumer.get(i));} else if(i%3==2){ player3.add(pookerNumer.get(i)); } } //对三个玩家的牌 排序 Collections.sort(player1); Collections.sort(player2); Collections.sort(player3); Collections.sort(bottom); //看牌 lookPooker("玩家1",player1,pookerMap);// 名称 牌序号 字典 lookPooker("玩家2",player2,pookerMap); lookPooker("玩家3",player3,pookerMap); lookPooker("底牌",bottom,pookerMap); } public static void lookPooker(String name,ArrayList<Integer> player,HashMap<Integer,String> pookerMap){ System.out.println(name+": "); for(int index:player){ System.out.print(pookerMap.get(index)+" ");// 对应字典 找出 牌序号的 值 } System.out.println(); }