18. 集合类(Map、Collections)
来源:互联网 发布:iphone6蜂窝数据4g设置 编辑:程序博客网 时间:2024/05/16 03:34
1:Map(掌握)
(1)将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
(2)Map和Collection的区别?
A:Map 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对
B:Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。光棍
* 注意:
* Map集合的数据结构值针对键有效,跟值无关
* HashMap,TreeMap等会讲。
* Collection集合的数据结构是针对元素有效
(3)Map接口功能概述
1:添加功能
V put(Kkey,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
2:删除功能
voidclear(): 移除所有的键值对元素
Vremove(Object key): 根据键删除键值对元素,并把值返回
3:判断功能
boolean containsKey(Objectkey): 判断集合是否包含指定的键
boolean containsValue(Objectvalue): 判断集合是否包含指定的值
boolean isEmpty(): 判断集合是否为空
public class MapDemo { publicstatic void main(String[] args) { //创建集合对象 Map<String,String> map = new HashMap<String, String>(); //添加元素 //V put(K key,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲 //System.out.println("put:" + map.put("文章", "马伊俐")); //System.out.println("put:" + map.put("文章", "姚笛")); map.put("邓超", "孙俪"); map.put("黄晓明", "杨颖"); map.put("周杰伦", "蔡依林"); map.put("刘恺威", "杨幂"); //void clear():移除所有的键值对元素 //map.clear(); //V remove(Object key):根据键删除键值对元素,并把值返回 //System.out.println("remove:" + map.remove("黄晓明")); //System.out.println("remove:" + map.remove("黄晓波")); //boolean containsKey(Object key):判断集合是否包含指定的键 //System.out.println("containsKey:" + map.containsKey("黄晓明")); //System.out.println("containsKey:" + map.containsKey("黄晓波")); //boolean isEmpty():判断集合是否为空 //System.out.println("isEmpty:"+map.isEmpty()); //intsize():返回集合中的键值对的对数 System.out.println("size:"+map.size()); //输出集合名称 System.out.println("map:"+ map); }}
4:获取功能
Set<Map.Entry<K,V>> entrySet(): 返回的是键值对对象的集合
V get(Objectkey): 根据键获取值
Set<K> keySet(): 获取集合中所有键的集合
Collection<V> values(): 获取集合中所有值的集合
public class MapDemo2 { publicstatic void main(String[] args) { //创建集合对象 Map<String,String> map = new HashMap<String, String>(); //创建元素并添加元素 map.put("邓超", "孙俪"); map.put("黄晓明", "杨颖"); map.put("周杰伦", "蔡依林"); map.put("刘恺威", "杨幂"); //V get(Object key):根据键获取值 System.out.println("get:"+ map.get("周杰伦")); System.out.println("get:"+ map.get("周杰")); // 返回null System.out.println("----------------------"); //Set<K> keySet():获取集合中所有键的集合 Set<String>set = map.keySet(); for(String key : set) { System.out.println(key); } System.out.println("----------------------"); //Collection<V> values():获取集合中所有值的集合 Collection<String>con = map.values(); for(String value : con) { System.out.println(value); } }}
5:长度功能
int size(): 返回集合中的键值对的对数
(4)Map集合的遍历
A:键找值
a:获取所有键的集合
b:遍历键的集合,得到每一个键
c:根据键到集合中去找值
public class MapDemo3 { publicstatic void main(String[] args) { //创建集合对象 Map<String,String> map = new HashMap<String, String>(); //创建元素并添加到集合 map.put("杨过", "小龙女"); map.put("郭靖", "黄蓉"); map.put("杨康", "穆念慈"); map.put("陈玄风", "梅超风"); //遍历 //获取所有的键 Set<String>set = map.keySet(); //遍历键的集合,获取得到每一个键 for(String key : set) { //根据键去找值 Stringvalue = map.get(key); System.out.println(key+ "---" + value); } }}
B:键值对对象找键和值
a:获取所有的键值对对象的集合
b:遍历键值对对象的集合,获取每一个键值对对象
c:根据键值对对象去获取键和值
public class MapDemo4 { publicstatic void main(String[] args) { //创建集合对象 Map<String,String> map = new HashMap<String, String>(); //创建元素并添加到集合 map.put("杨过", "小龙女"); map.put("郭靖", "黄蓉"); map.put("杨康", "穆念慈"); map.put("陈玄风", "梅超风"); //获取所有键值对对象的集合 Set<Map.Entry<String,String>> set = map.entrySet(); //遍历键值对对象的集合,得到每一个键值对对象 for(Map.Entry<String, String> me : set) { //根据键值对对象获取键和值 Stringkey = me.getKey(); Stringvalue = me.getValue(); System.out.println(key+ "---" + value); } }}
(5)HashMap集合的练习
A:HashMap<String,String>
public class HashMapDemo { publicstatic void main(String[] args) { //创建集合对象 HashMap<String,String> hm = new HashMap<String, String>(); //创建元素并添加元素 //String key1 = "it001"; //String value1 = "马云"; //hm.put(key1, value1); hm.put("it001","马云"); hm.put("it003","马化腾"); hm.put("it004","乔布斯"); hm.put("it005","张朝阳"); hm.put("it002","裘伯君"); // wps hm.put("it001","比尔盖茨"); //遍历 Set<String>set = hm.keySet(); for(String key : set) { Stringvalue = hm.get(key); System.out.println(key+ "---" + value); } }}
B:HashMap<Integer,String>
public class HashMapDemo2 { publicstatic void main(String[] args) { //创建集合对象 HashMap<Integer,String> hm = new HashMap<Integer, String>(); //创建元素并添加元素 //Integer i = new Integer(27); //Integer i = 27; // String s = "林青霞"; // hm.put(i, s); hm.put(27,"林青霞"); hm.put(30,"风清扬"); hm.put(28,"刘意"); hm.put(29,"林青霞"); //下面的写法是八进制,但是不能出现8以上的单个数据 //hm.put(003, "hello"); //hm.put(006, "hello"); //hm.put(007, "hello"); //hm.put(008, "hello"); //遍历 Set<Integer>set = hm.keySet(); for(Integer key : set) { Stringvalue = hm.get(key); System.out.println(key+ "---" + value); } //下面这种方式仅仅是集合的元素的字符串表示 //System.out.println("hm:" + hm); }}
C:HashMap<String,Student>
public class HashMapDemo3 { publicstatic void main(String[] args) { //创建集合对象 HashMap<String,Student> hm = new HashMap<String, Student>(); //创建学生对象 Students1 = new Student("周星驰",58); Students2 = new Student("刘德华",55); Students3 = new Student("梁朝伟",54); Students4 = new Student("刘嘉玲",50); //添加元素 hm.put("9527",s1); hm.put("9522",s2); hm.put("9524",s3); hm.put("9529",s4); //遍历 Set<String>set = hm.keySet(); for(String key : set) { //注意了:这次值不是字符串了 //String value = hm.get(key); Studentvalue = hm.get(key); System.out.println(key+ "---" + value.getName() + "---" + value.getAge()); } }}
D:HashMap<Student,String>
public class HashMapDemo4 { publicstatic void main(String[] args) { //创建集合对象 HashMap<Student,String> hm = new HashMap<Student, String>(); //创建学生对象 Students1 = new Student("貂蝉",27); Students2 = new Student("王昭君",30); Students3 = new Student("西施",33); Students4 = new Student("杨玉环",35); Students5 = new Student("貂蝉",27); //添加元素 hm.put(s1,"8888"); hm.put(s2,"6666"); hm.put(s3,"5555"); hm.put(s4,"7777"); hm.put(s5,"9999"); //遍历 Set<Student>set = hm.keySet(); for(Student key : set) { Stringvalue = hm.get(key); System.out.println(key.getName()+ "---" + key.getAge() + "---"+ value); } }}
public class Student { privateString name; privateint age; publicStudent() { super(); } publicStudent(String name, int age) { super(); this.name= name; this.age= age; } publicString getName() { retur nname; } publicvoid setName(String name) { this.name= name; } publicint getAge() { returnage; } publicvoid setAge(int age) { this.age= age; } @Override publicint hashCode() { finalint prime = 31; intresult = 1; result= prime * result + age; result= prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override publicboolean equals(Object obj) { if(this == obj) return true; if(obj == null) return false; if(getClass() != obj.getClass()) return false; Studentother = (Student) obj; if(age != other.age) return false; if(name == null) { if(other.name != null) return false; }else if (!name.equals(other.name)) return false; return true; }}
(6)LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
* 由哈希表保证键的唯一性
* 由链表保证键盘的有序(存储和取出的顺序一致)
public class LinkedHashMapDemo { publicstatic void main(String[] args) { //创建集合对象 LinkedHashMap<String,String> hm = new LinkedHashMap<String, String>(); //创建并添加元素 hm.put("2345","hello"); hm.put("1234","world"); hm.put("3456","java"); hm.put("1234","javaee"); hm.put("3456","android"); //遍历 Set<String>set = hm.keySet(); for(String key : set) { Stringvalue = hm.get(key); System.out.println(key+ "---" + value); } }}
(7)TreeMap(是基于红黑树的Map接口的实现)集合的练习
A:TreeMap<String,String>
public class TreeMapDemo { publicstatic void main(String[] args) { //创建集合对象 TreeMap<String,String> tm = new TreeMap<String, String>(); //创建元素并添加元素 tm.put("hello","你好"); tm.put("world","世界"); tm.put("java","爪哇"); tm.put("world","世界2"); tm.put("javaee","爪哇EE"); //遍历集合 Set<String>set = tm.keySet(); for(String key : set) { Stringvalue = tm.get(key); System.out.println(key+ "---" + value); } }}
B:TreeMap<Student,String>
public class Student { privateString name; privateint age; publicStudent() { super(); } publicStudent(String name, int age) { super(); this.name= name; this.age= age; } publicString getName() { returnname; } publicvoid setName(String name) { this.name= name; } publicint getAge() { returnage; } publicvoid setAge(int age) { this.age= age; }}
public class TreeMapDemo2 { publicstatic void main(String[] args) { //创建集合对象 TreeMap<Student,String> tm = new TreeMap<Student, String>( newComparator<Student>() { @Override publicint compare(Student s1, Student s2) { //主要条件 intnum = s1.getAge() - s2.getAge(); //次要条件 intnum2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; returnnum2; } }); //创建学生对象 Students1 = new Student("潘安",30); Student s2 = new Student("柳下惠", 35); Students3 = new Student("唐伯虎",33); Students4 = new Student("燕青",32); Students5 = new Student("唐伯虎",33); //存储元素 tm.put(s1,"宋朝"); tm.put(s2,"元朝"); tm.put(s3,"明朝"); tm.put(s4,"清朝"); tm.put(s5,"汉朝"); //遍历 Set<Student>set = tm.keySet(); for(Student key : set) { Stringvalue = tm.get(key); System.out.println(key.getName()+ "---" + key.getAge() + "---"+ value); } }}
(8)面试题:Hashtable和HashMap的区别?
Hashtable: 线程安全,效率低。不允许null键和null值
HashMap: 线程不安全,效率高。允许null键和null值
(9)面试题:List,Set,Map等接口是否都继承子Map接口?
List,Set不是继承自Map接口,它们继承自Collection接口
Map接口本身就是一个顶层接口
public class HashtableDemo { publicstatic void main(String[] args) { //HashMap<String, String> hm = new HashMap<String, String>(); Hashtable<String,String> hm = new Hashtable<String, String>(); hm.put("it001","hello"); //hm.put(null, "world"); //NullPointerException //hm.put("java", null); // NullPointerException System.out.println(hm); }}
(10)案例(掌握)
A:统计一个字符串中每个字符出现的次数
* 需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
* 分析:
* A:定义一个字符串(可以改进为键盘录入)
* B:定义一个TreeMap集合
* 键:Character
* 值:Integer
* C:把字符串转换为字符数组
* D:遍历字符数组,得到每一个字符
* E:拿刚才得到的字符作为键到集合中去找值,看返回值
* 是null:说明该键不存在,就把该字符作为键,1作为值存储
* 不是null:说明该键存在,就把值加1,然后重写存储该键和值
* F:定义字符串缓冲区变量
* G:遍历集合,得到键和值,进行按照要求拼接
* H:把字符串缓冲区转换为字符串输出
* 录入:linqingxia
* 结果:result:a(1)g(1)i(3)l(1)n(2)q(1)x(1)
public class TreeMapDemo { publicstatic void main(String[] args) { //定义一个字符串(可以改进为键盘录入) Scannersc = new Scanner(System.in); System.out.println("请输入一个字符串:"); Stringline = sc.nextLine(); //定义一个TreeMap集合 TreeMap<Character,Integer> tm = new TreeMap<Character, Integer>(); //把字符串转换为字符数组 char[]chs = line.toCharArray(); //遍历字符数组,得到每一个字符 for(charch : chs){ //拿刚才得到的字符作为键到集合中去找值,看返回值 Integeri = tm.get(ch); //是null:说明该键不存在,就把该字符作为键,1作为值存储 if(i== null){ tm.put(ch,1); }else{ //不是null:说明该键存在,就把值加1,然后重写存储该键和值 i++; tm.put(ch,i); } } //定义字符串缓冲区变量 StringBuildersb= new StringBuilder(); //遍历集合,得到键和值,进行按照要求拼接 Set<Character>set = tm.keySet(); for(Characterkey : set){ Integervalue = tm.get(key); sb.append(key).append("(").append(value).append(")"); } //把字符串缓冲区转换为字符串输出 Stringresult = sb.toString(); System.out.println("result:"+result); }}
B:集合的嵌套遍历
a:HashMap嵌套HashMap
* jc 基础班
* 陈玉楼 20
* 高跃 22
* jy 就业班
* 李杰 21
* 曹石磊 23
* 先存储元素,然后遍历元素
publicclass HashMapDemo2 { public static void main(String[] args) { // 创建集合对象 HashMap<String,HashMap<String, Integer>> czbkMap = new HashMap<String,HashMap<String, Integer>>(); // 创建基础班集合对象 HashMap<String, Integer>jcMap = new HashMap<String, Integer>(); // 添加元素 jcMap.put("陈玉楼", 20); jcMap.put("高跃", 22); // 把基础班添加到大集合 czbkMap.put("jc",jcMap); // 创建就业班集合对象 HashMap<String, Integer>jyMap = new HashMap<String, Integer>(); // 添加元素 jyMap.put("李杰", 21); jyMap.put("曹石磊", 23); // 把就业班添加到大集合 czbkMap.put("jy",jyMap); //遍历集合 Set<String> czbkMapSet =czbkMap.keySet(); for(String czbkMapKey :czbkMapSet){ System.out.println(czbkMapKey); HashMap<String,Integer> czbkMapValue = czbkMap.get(czbkMapKey); Set<String>czbkMapValueSet = czbkMapValue.keySet(); for(String czbkMapValueKey: czbkMapValueSet){ IntegerczbkMapValueValue = czbkMapValue.get(czbkMapValueKey); System.out.println("\t"+czbkMapValueKey+"---"+czbkMapValueValue); } } }}
b:HashMap嵌套ArrayList
*需求:
*假设HashMap集合的元素是ArrayList。有3个。
*每一个ArrayList集合的值是字符串。
*元素我已经完成,请遍历。
*结果:
* 三国演义
* 吕布
* 周瑜
* 笑傲江湖
* 令狐冲
* 林平之
* 神雕侠侣
* 郭靖
* 杨过
public class HashMapIncludeArrayListDemo{ publicstatic void main(String[] args) { //创建集合对象 HashMap<String,ArrayList<String>> hm = new HashMap<String,ArrayList<String>>(); //创建元素集合1 ArrayList<String>array1 = new ArrayList<String>(); array1.add("吕布"); array1.add("周瑜"); hm.put("三国演义", array1); //创建元素集合2 ArrayList<String>array2 = new ArrayList<String>(); array2.add("令狐冲"); array2.add("林平之"); hm.put("笑傲江湖", array2); //创建元素集合3 ArrayList<String>array3 = new ArrayList<String>(); array3.add("郭靖"); array3.add("杨过"); hm.put("神雕侠侣", array3); //遍历集合 Set<String>set = hm.keySet(); for(Stringkey : set){ System.out.println(key); ArrayList<String>value = hm.get(key); for(Strings : value){ System.out.println("\t"+s); } } }}
c:ArrayList嵌套HashMap
需求:
假设ArrayList集合的元素是HashMap。有3个。
每一个HashMap集合的键和值都是字符串。
元素我已经完成,请遍历。
结果:
周瑜---小乔
吕布---貂蝉
郭靖---黄蓉
杨过---小龙女
令狐冲---任盈盈
林平之---岳灵珊
public classArrayListIncludeHashMapDemo { publicstatic void main(String[] args) { //创建集合对象 ArrayList<HashMap<String,String>> array = new ArrayList<HashMap<String, String>>(); //创建元素1 HashMap<String,String> hm1 = new HashMap<String, String>(); hm1.put("周瑜", "小乔"); hm1.put("吕布", "貂蝉"); //把元素添加到array里面 array.add(hm1); //创建元素1 HashMap<String,String> hm2 = new HashMap<String, String>(); hm2.put("郭靖", "黄蓉"); hm2.put("杨过", "小龙女"); //把元素添加到array里面 array.add(hm2); //创建元素1 HashMap<String,String> hm3 = new HashMap<String, String>(); hm3.put("令狐冲", "任盈盈"); hm3.put("林平之", "岳灵珊"); //把元素添加到array里面 array.add(hm3); //遍历 for(HashMap<String, String> hm : array) { Set<String>set = hm.keySet(); for(String key : set) { Stringvalue = hm.get(key); System.out.println(key+ "---" + value); } } }}
d:多层嵌套
* 为了更符合要求:
* 这次的数据就看成是学生对象。
* bj 北京校区
* jc 基础班
* 林青霞 27
* 风清扬 30
* jy 就业班
* 赵雅芝 28
* 武鑫 29
* sh 上海校区
* jc 基础班
* 郭美美 20
* 犀利哥 22
* jy 就业班
* 罗玉凤 21
* 马征 23
* gz 广州校区
* jc 基础班
* 王力宏 30
* 李静磊 32
* jy 就业班
* 郎朗 31
* 柳岩 33
* xa 西安校区
* jc 基础班
* 范冰冰 27
* 刘意 30
* jy 就业班
* 李冰冰 28
* 张志豪 29
publicclass HashMapDemo { public static void main(String[] args) { // 创建大集合 HashMap<String,HashMap<String, ArrayList<Student>>> czbkMap = newHashMap<String, HashMap<String, ArrayList<Student>>>(); // 北京校区数据 HashMap<String,ArrayList<Student>> bjCzbkMap = new HashMap<String,ArrayList<Student>>(); ArrayList<Student> array1 =new ArrayList<Student>(); Student s1 = new Student("林青霞", 27); Student s2 = new Student("风清扬", 30); array1.add(s1); array1.add(s2); ArrayList<Student> array2 =new ArrayList<Student>(); Student s3 = new Student("赵雅芝", 28); Student s4 = new Student("武鑫", 29); array2.add(s3); array2.add(s4); bjCzbkMap.put("基础班", array1); bjCzbkMap.put("就业班", array2); czbkMap.put("北京校区", bjCzbkMap); // 晚上可以自己练习一下 // 上海校区数据自己做 // 广州校区数据自己做 // 西安校区数据 HashMap<String,ArrayList<Student>> xaCzbkMap = new HashMap<String,ArrayList<Student>>(); ArrayList<Student> array3 =new ArrayList<Student>(); Student s5 = new Student("范冰冰", 27); Student s6 = new Student("刘意", 30); array3.add(s5); array3.add(s6); ArrayList<Student> array4 =new ArrayList<Student>(); Student s7 = new Student("李冰冰", 28); Student s8 = new Student("张志豪", 29); array4.add(s7); array4.add(s8); xaCzbkMap.put("基础班", array3); xaCzbkMap.put("就业班", array4); czbkMap.put("西安校区", xaCzbkMap); // 遍历集合 Set<String> czbkMapSet =czbkMap.keySet(); for (String czbkMapKey :czbkMapSet) { System.out.println(czbkMapKey); HashMap<String,ArrayList<Student>> czbkMapValue = czbkMap.get(czbkMapKey); Set<String>czbkMapValueSet = czbkMapValue.keySet(); for (String czbkMapValueKey: czbkMapValueSet) { System.out.println("\t"+ czbkMapValueKey); ArrayList<Student>czbkMapValueValue = czbkMapValue.get(czbkMapValueKey); for (Student s :czbkMapValueValue) { System.out.println("\t\t"+ s.getName() + "---"+ s.getAge()); } } } }}
public class Student { privateString name; privateint age; publicStudent() { super(); } publicStudent(String name, int age) { super(); this.name= name; this.age= age; } publicString getName() { return name; } publicvoid setName(String name) { this.name= name; } publicint getAge() { return age; } publicvoid setAge(int age) { this.age= age; }}
2:Collections是类、Collection是接口(理解)
(1) Collections:是针对集合进行操作的工具类,都是静态方法。
(2)面试题:Collection和Collections的区别
A:Collection是单列集合的顶层接口,有两个子接口List和Set
B:Collections是针对集合进行操作的工具类,可以对集合进行排序和查找等
(3)常见的几个小方法:
public static <T> void sort(List<T> list): 排序 默认情况下是自然顺序。
* Collections可以针对ArrayList存储基本包装类的元素排序,存储自定义对象可不可以排序呢?
public class CollectionsDemo { publicstatic void main(String[] args) { //创建集合对象 List<Student>list = new ArrayList<Student>(); //创建学生对象 Students1 = new Student("林青霞",27); Students2 = new Student("风清扬",30); Students3 = new Student("刘晓曲",28); Students4 = new Student("武鑫",29); Students5 = new Student("林青霞",27); //添加元素对象 list.add(s1); list.add(s2); list.add(s3); list.add(s4); list.add(s5); //排序 //自然排序 //Collections.sort(list); //比较器排序 //如果同时有自然排序和比较器排序,以比较器排序为主 Collections.sort(list,new Comparator<Student>() { @Override publicint compare(Student s1, Student s2) { intnum = s2.getAge() - s1.getAge(); intnum2 = num == 0 ? s1.getName().compareTo(s2.getName()): num; returnnum2; } }); //遍历集合 for(Student s : list) { System.out.println(s.getName()+ "---" + s.getAge()); } }}
public static <T> int binarySearch(List<?> list,T key): 二分查找
public static <T> T max(Collection<?> coll): 最大值
public static void reverse(List<?> list): 反转
public static void shuffle(List<?> list): 随机置换
public class CollectionsDemo { publicstatic void main(String[] args) { // 创建集合对象 List<Integer>list = new ArrayList<Integer>(); // 添加元素 list.add(30); list.add(20); list.add(50); list.add(10); list.add(40); System.out.println("list:"+ list); // public static <T> void sort(List<T>list):排序默认情况下是自然顺序。 //Collections.sort(list); //System.out.println("list:" + list); //[10, 20, 30, 40, 50] // public static <T> int binarySearch(List<?>list,T key):二分查找 //System.out //.println("binarySearch:" + Collections.binarySearch(list, 30)); //System.out.println("binarySearch:" //+ Collections.binarySearch(list, 300)); // public static <T> T max(Collection<?>coll):最大值 //System.out.println("max:"+Collections.max(list)); // public static void reverse(List<?> list):反转 //Collections.reverse(list); //System.out.println("list:" + list); //public staticvoid shuffle(List<?> list):随机置换 Collections.shuffle(list); System.out.println("list:"+ list); }}
(4)案例
A:ArrayList集合存储自定义对象的排序
B:模拟斗地主装牌和洗牌
* 模拟斗地主洗牌和发牌
*
* 分析:
* A:创建一个牌盒
* B:装牌
* C:洗牌
* D:发牌
* E:看牌
public class PokerDemo { publicstatic void main(String[] args) { //创建一个牌盒 ArrayList<String>array = new ArrayList<String>(); //装牌 //黑桃A,黑桃2,黑桃3,...黑桃K //红桃A,... //梅花A,... //方块A,... //定义一个花色数组 String[]colors = { "♠", "♥", "♣","♦" }; //定义一个点数数组 String[]numbers = { "A", "2", "3", "4","5", "6", "7", "8", "9","10","J", "Q", "K" }; //装牌 for(String color : colors) { for(String number : numbers) { array.add(color.concat(number)); } } array.add("小王"); array.add("大王"); //洗牌 Collections.shuffle(array); //System.out.println("array:" + array); //发牌 ArrayList<String>fengQingYang = new ArrayList<String>(); ArrayList<String>linQingXia = new ArrayList<String>(); ArrayList<String>liuYi = new ArrayList<String>(); ArrayList<String>diPai = new ArrayList<String>(); for(int x = 0; x < array.size(); x++) { if(x >= array.size() - 3) { diPai.add(array.get(x)); }else if (x % 3 == 0) { fengQingYang.add(array.get(x)); } else if (x % 3 == 1) { linQingXia.add(array.get(x)); }else if (x % 3 == 2) { liuYi.add(array.get(x)); } } //看牌 lookPoker("风清扬", fengQingYang); lookPoker("林青霞", linQingXia); lookPoker("刘意", liuYi); lookPoker("底牌", diPai); } publicstatic void lookPoker(String name, ArrayList<String> array) { System.out.print(name+ "的牌是:"); for(String s : array) { System.out.print(s+ " "); } System.out.println(); }}
C:模拟斗地主发牌和看牌并对牌进行排序
* 思路:
* A:创建一个HashMap集合
* B:创建一个ArrayList集合
* C:创建花色数组和点数数组
* D:从0开始往HashMap里面存储编号,并存储对应的牌
* 同时往ArrayList里面存储编号即可。
* E:洗牌(洗的是编号)
* F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
* G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
public class PokerDemo { publicstatic void main(String[] args) { //创建一个HashMap集合 HashMap<Integer,String> hm = new HashMap<Integer, String>(); //创建一个ArrayList集合 ArrayList<Integer>array = new ArrayList<Integer>(); //创建花色数组和点数数组 //定义一个花色数组 String[]colors = { "♠", "♥", "♣","♦" }; //定义一个点数数组 String[]numbers = { "3", "4", "5", "6","7", "8", "9", "10", "J","Q","K", "A", "2", };// 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。 intindex = 0; for(String number : numbers) { for(String color : colors) { Stringpoker = color.concat(number); hm.put(index,poker); array.add(index); index++; } } hm.put(index,"小王"); array.add(index); index++; hm.put(index,"大王"); array.add(index); //洗牌(洗的是编号) Collections.shuffle(array); //发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收) TreeSet<Integer>fengQingYang = new TreeSet<Integer>(); TreeSet<Integer>linQingXia = new TreeSet<Integer>(); TreeSet<Integer>liuYi = new TreeSet<Integer>(); TreeSet<Integer>diPai = new TreeSet<Integer>(); for(int x = 0; x < array.size(); x++) { if(x >= array.size() - 3) { diPai.add(array.get(x)); }else if (x % 3 == 0) { fengQingYang.add(array.get(x)); }else if (x % 3 == 1) { linQingXia.add(array.get(x)); }else if (x % 3 == 2) { liuYi.add(array.get(x)); } } //看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌) lookPoker("风清扬", fengQingYang, hm); lookPoker("林青霞", linQingXia, hm); lookPoker("刘意", liuYi, hm); lookPoker("底牌", diPai, hm); } //写看牌的功能 publicstatic void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer,String> hm) { System.out.print(name+ "的牌是:"); for(Integer key : ts) { Stringvalue = hm.get(key); System.out.print(value+ " "); } System.out.println(); }}
- 18. 集合类(Map、Collections)
- 黑马程序员---集合-Map集合,Collections类
- 集合类Map ConcurrentHashMap Collections.synchronizedMap()
- 集合框架(Map和Collections)
- 10.集合框架(三)【Map】【集合技巧】【工具类Collections】【工具类Arrays】
- Map(接口简介、HashMap集合、TreeMap集合、Properties、泛型、Collections工具类、Arrays工具类)
- 黑马程序员--集合框架(map集合,Collections,Arrays)
- 集合框架---Map、Collections、compare
- (集合【Map、可变参数、Collections】)
- 黑马程序员——Java语言基础:集合框架(Collection、Map,工具类Collections、Arrays)
- Collections集合操作(List、Set、Map)-巧用工具类
- Map集合#泛型固定下边界#Collections工具类
- JAVA基础复习十八-Map集合、Collections类
- Java集合架构(二、Map、Collections、Arrays)
- Java集合框架(List, Set, Map, Collections)
- JavaSE---API之集合(Map及其子类、Collections)
- ES6学习——集合(Collections):Map API
- ES6学习——集合(Collections):Map 应用示例
- Python中用PIL/Pillow裁剪图片
- 已知数组A[n]中的元素为整型,设计算法将其调整为左右两个部分,左边所有元素为奇数,右边所有元素为偶数,要求时间复杂度为O(n)
- PHP 时间段计算,今天、本周、上周、上月 ...
- easyui-treegrid 加载数据格式
- centos7通过yum安装mysql,并授权远程连接
- 18. 集合类(Map、Collections)
- 自定义安全过滤
- jdbc.properties备忘录
- haskell学习笔记(5)-函数与递归
- Js写购物车全选全不选计算单价总价代码
- 欧拉角
- Spark Streaming DSstream 的updateByKey用法
- 【Scala】基础_for
- 交叉编译openblas到hisi3159v101