Java基础-集合的嵌套
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.静态导入
静态导入是在JDK1.5后的新特性,可以减少开发的代码量,但是实际用处是很一般,静态导入的标准写法只有在导入包的时候才能使用。导入包的最末尾必须是一个静态成员。接下来我们可以看一下案例
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note3; 8 9 import static java.lang.System.out; 10 import static java.util.Arrays.sort; 11 12 13 public class StaticImportDemo { 14 public static void main(String[] args) { 15 //发现没有,打印的时候不用写System啦! 16 out.println("yinzhengjie"); 17 int [] arr = {9,7,5,3,1}; 18 //发现没有,我没有写类名,直接写方法就可以啦! 19 sort(arr); 20 for (int i : arr) { 21 System.out.println(i); 22 } 23 } 24 } 25 26 /* 27 以上代码执行结果如下: 28 yinzhengjie 29 1 30 3 31 5 32 7 33 9 34 */
二.方法的可变参数
JDK1.5后的新特性,方法的可变参数,前提是方法参数数据类型确定,参数的个数任意。案例如下:
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note4; 8 9 public class VarArgumentsDemo { 10 public static void main(String[] args) { 11 int sum = getsum(512,321,14,53,566,768,854,123,21,534,786); 12 System.out.println(sum); 13 } 14 15 //定义方法求任何个整数和,由于传入的参数不固定,因此我们就将形式参数设置为可变参数。 16 private static int getsum(int... args) { 17 int sum = 0; 18 for (int i : args) { 19 sum += i; 20 } 21 return sum; 22 } 23 } 24 25 26 /* 27 以上代码执行结果如下: 28 4552 29 */
可变采参数的注意事项:
1>.一个方法中,可变参数只能有一个;
2>.可变参数必须写在参数列表的最后一个;
三.Collection工具类
1>.Collections.sort静态方法【对List结合进行升序排列】
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note4; 8 9 import java.util.ArrayList; 10 import java.util.Collection; 11 import java.util.Collections; 12 import java.util.List; 13 14 public class CollectionsDemo { 15 public static void main(String[] args) { 16 List<String> list = new ArrayList<>(); 17 list.add("Y"); 18 list.add("I"); 19 list.add("N"); 20 list.add("zheng"); 21 list.add("jie"); 22 System.out.println(list); 23 //对List集合,继续升序排序。 24 Collections.sort(list); 25 System.out.println(list); 26 27 } 28 } 29 30 /* 31 以上代码执行结果如下: 32 [Y, I, N, zheng, jie] 33 [I, N, Y, jie, zheng] 34 */
2>.Collections.binarySearch静态方法【对List集合进行二分搜索,方法参数,传递List集合,传递被查找的元素】
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note4; 8 9 import java.util.ArrayList; 10 import java.util.Collection; 11 import java.util.Collections; 12 import java.util.List; 13 14 public class CollectionsDemo { 15 public static void main(String[] args) { 16 List<Integer> list = new ArrayList<>(); 17 list.add(1); 18 list.add(3); 19 list.add(5); 20 list.add(7); 21 list.add(9); 22 list.add(11); 23 //调用工具类静态方法binarySearch 24 int index = Collections.binarySearch(list, 9); 25 System.out.println(index); 26 //若找不到索引的话,就返回插入点的相反数减去一的值,比如8应该是在7的后面,7后面的索引应该是4,相反数为-4,在相反数的基础上减去1,因此返回值应该是-5 27 index = Collections.binarySearch(list, 8); 28 System.out.println(index); 29 } 30 } 31 32 /* 33 以上代码执行结果如下: 34 4 35 -5 36 */
3>.Collections.shuffle静态方法【对List集合中的元素,进行随机排序】
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note4; 8 9 import java.util.ArrayList; 10 import java.util.Collection; 11 import java.util.Collections; 12 import java.util.List; 13 14 public class CollectionsDemo { 15 public static void main(String[] args) { 16 List<Integer> list = new ArrayList<>(); 17 list.add(1); 18 list.add(3); 19 list.add(5); 20 list.add(7); 21 list.add(9); 22 list.add(11); 23 System.out.println(list); 24 25 Collections.shuffle(list); 26 27 System.out.println(list); 28 29 } 30 } 31 32 /* 33 以上代码执行结果如下: 34 [1, 3, 5, 7, 9, 11] 35 [11, 5, 1, 3, 9, 7] 36 */
4>.将不安全的集合改变成为安全的集合,常见的方法如下:
四.集合的嵌套
集合嵌套并不是一个新的指示单,仅仅是集合存储的对象还是集合,如Collection集合嵌套,Collection集合与Map集合互相嵌套,Map集合嵌套。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note4; 8 9 import java.util.HashMap; 10 import java.util.Iterator; 11 import java.util.Map.Entry; 12 import java.util.Set; 13 14 public class MapMapDemo { 15 public static void main(String[] args) { 16 //定义安康的集合 17 HashMap<String, String> ankang = new HashMap<>(); 18 //定义北京的集合 19 HashMap<String, String> beijing = new HashMap<>(); 20 //定义存放地名的集合 21 HashMap<String, HashMap<String,String>> CtiyScenicSpot = 22 new HashMap<String, HashMap<String,String>> (); 23 //往安康这个集合存放数据 24 ankang.put("岚皋县", "南宫山"); 25 ankang.put("平利县", "腊肉"); 26 ankang.put("紫阳县", "富硒茶"); 27 ankang.put("汉滨区", "长江大桥"); 28 //往北京这个集合存放数据 29 beijing.put("大兴区", "野生动物园"); 30 beijing.put("朝阳区", "望京SOHO"); 31 beijing.put("海淀区", "中关村"); 32 33 //将安康和北京两个集合放入存放地名的集合中去 34 CtiyScenicSpot.put("安康", ankang); 35 CtiyScenicSpot.put("北京", beijing); 36 // keySet(CtiyScenicSpot); 37 entrySet(CtiyScenicSpot); 38 } 39 40 //遍历方式一:通过keySet方式进行遍历 41 public static void keySet(HashMap<String, HashMap<String,String>> CtiyScenicSpot) { 42 //调用CtiyScenicSpot集合方法keySet将键存储到Set集合 43 Set<String> cityNameset = CtiyScenicSpot.keySet(); 44 //迭代Set集合 45 Iterator<String> cityName = cityNameset.iterator(); 46 while(cityName.hasNext()) { 47 //获取CtiyScenicSpot集合的键 48 String cityNameKey = cityName.next(); 49 //CtiyScenicSpot集合的方法get获取值,值是一个HashMap集合 50 HashMap<String,String> cityMap = CtiyScenicSpot.get(cityNameKey); 51 //调用cityMap集合方法keySet,键存储到Set集合 52 Set<String> CountyAreaSet = cityMap.keySet(); 53 Iterator<String> CountyAreaIt = CountyAreaSet.iterator(); 54 while(CountyAreaIt.hasNext()) { 55 //CountyAreaIt.hasNext()获取出来的是cityMap的键,县和区 56 String CountyAreaKey = CountyAreaIt.next(); 57 //调用cityMap集合中的get方法取值 58 String CharacteristicRepresentation = cityMap.get(CountyAreaKey); 59 System.out.println(cityNameKey+"--"+CountyAreaKey+"--"+CharacteristicRepresentation); 60 } 61 } 62 } 63 64 //遍历方式二:通过entrySet方式进行遍历 65 public static void entrySet(HashMap<String, HashMap<String,String>> CtiyScenicSpot) { 66 //调用CtiyScenicSpot集合entrySet方法,将CtiyScenicSpot集合的键值对关系对象,存储到Set集合 67 Set<Entry<String, HashMap<String, String>>> cityNameset = CtiyScenicSpot.entrySet(); 68 //迭代器迭代Set集合 69 Iterator<Entry<String, HashMap<String, String>>> cityNameIt = cityNameset.iterator(); 70 while(cityNameIt.hasNext()) { 71 //cityNameIt.hasNext()方法,取出的是CtiyScenicSpot结合键值对关系对象 72 Entry<String, HashMap<String, String>> cityNameEntry = cityNameIt.next(); 73 //cityNameEntry方法getkey,getValue 74 String cityNamekey = cityNameEntry.getKey(); 75 //获取值,值是一个Map集合 76 HashMap<String, String> classMap = cityNameEntry.getValue(); 77 //调用集合classMap方法entrySet,键值对关系对象存储Set集合 78 Set<Entry<String, String>> CountyAreaSet = classMap.entrySet(); 79 //迭代CountyAreaSet集合 80 Iterator<Entry<String, String>> CountyAreaIt = CountyAreaSet.iterator(); 81 while(CountyAreaIt.hasNext()) { 82 //CountyAreaIt.hasNext()获取出来的是cityMap的键,县和区 83 Entry<String, String> CountyAreaEntry = CountyAreaIt.next(); 84 //调用CountyAreaEntry的getKey和getValue方法 85 String CountyAreaKey = CountyAreaEntry.getKey(); 86 String CountyAreaValue = CountyAreaEntry.getValue(); 87 System.out.println(cityNamekey+"--"+CountyAreaKey+"--"+CountyAreaValue); 88 } 89 90 } 91 } 92 } 93 94 95 /* 96 以上代码执行结果如下: 97 安康--岚皋县--南宫山 98 安康--平利县--腊肉 99 安康--紫阳县--富硒茶 100 安康--汉滨区--长江大桥 101 北京--朝阳区--望京SOHO 102 北京--大兴区--野生动物园 103 北京--海淀区--中关村 104 */
五.模拟斗地主洗牌发牌案例
1>.项目需求
按照斗地主的规则,完成洗牌发牌的动作,具体规则如下:
a>.组装54张扑克牌;
b>.将54张牌顺序打乱;
c>.三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌;
d>.查看三人各自手中的底牌(按照牌的大小顺序);
注意:手中扑克牌从小到大的摆放顺序依次是:“大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3”。
2>.案例需求分析
a>.准备牌:
完成纸牌和数字的映射关系:使用双列Map集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。
b>.洗牌
通过数字完成洗牌和发牌。
c>.发牌
将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌,存放过程中要求数字大小与斗地主规则的大小对应,将代表不同纸牌的数字分别分配给不同的玩家与底牌。
d>.看牌
通过Map集合找到对应字符展示,通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。
3>.模拟斗地主代码实现
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note4; 8 9 import java.util.ArrayList; 10 import java.util.Collections; 11 import java.util.HashMap; 12 13 public class DouDiZhu { 14 public static void main(String[] args) { 15 16 //1. 组合牌 17 //创建Map集合,键是编号,值是牌 18 HashMap<Integer,String> pooker = new HashMap<Integer, String>(); 19 //创建List集合,存储编号,该集合有序的特点可以存放相应的int类型。 20 ArrayList<Integer> pookerNumber = new ArrayList<Integer>(); 21 //定义出13个点数的数组,注意顺序是从大到小 22 String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"}; 23 //定义4个花色数组,因为扑克牌就四个花色 24 String[] colors = {"黑桃","红桃","梅花","方块"}; 25 //定义整数变量,作为键出现,其中0与1索引空出来用于存放大小王。 26 int index = 2; 27 //遍历数组,花色+点数的组合,存储到Map集合 28 for(String number : numbers){ 29 for(String color : colors){ 30 //将扑克牌的索引与对应的扑克牌进行绑定【注意,字符串需要做一个拼接操作】。 31 pooker.put(index, color+number); 32 //将编号加入集合中并要自加1. 33 pookerNumber.add(index++); 34 } 35 } 36 //存储大王,和小王 37 pooker.put(0, "大王"); 38 pookerNumber.add(0); 39 pooker.put(1, "小王"); 40 pookerNumber.add(1); 41 42 //2>洗牌功能 43 //将牌的编号打乱 44 Collections.shuffle(pookerNumber); 45 46 //3>.发牌功能 47 //将牌编号,发给玩家集合,底牌集合 48 ArrayList<Integer> player1 = new ArrayList<Integer>(); 49 ArrayList<Integer> player2 = new ArrayList<Integer>(); 50 ArrayList<Integer> player3 = new ArrayList<Integer>(); 51 ArrayList<Integer> bottom = new ArrayList<Integer>(); 52 53 //发牌采用的是集合索引%3 54 for(int i = 0 ; i < pookerNumber.size() ; i++){ 55 //先将底牌做好 56 if(i < 3){ 57 //存到底牌去 58 bottom.add( pookerNumber.get(i)); 59 //对索引%3判断 60 }else if(i % 3 == 0){ 61 //索引上的编号,发给玩家1 62 player1.add( pookerNumber.get(i) ); 63 }else if( i % 3 == 1){ 64 //索引上的编号,发给玩家2 65 player2.add( pookerNumber.get(i) ); 66 }else if( i % 3 == 2){ 67 //索引上的编号,发给玩家3 68 player3.add( pookerNumber.get(i) ); 69 } 70 } 71 72 //4>.对玩家手中的编号排序 73 Collections.sort(player1); 74 Collections.sort(player2); 75 Collections.sort(player3); 76 77 //5>.看牌, 78 //将玩家手中的编号,到Map集合中查找,根据键找值. 79 look("尹正杰",player1,pooker); 80 look("刘亦菲",player2,pooker); 81 look("邓紫棋",player3,pooker); 82 look("底牌",bottom,pooker); 83 } 84 85 //定义看牌的方法 86 public static void look(String name,ArrayList<Integer> player,HashMap<Integer,String> pooker){ 87 //遍历ArrayList集合,获取元素,作为键,到集合Map中找值 88 System.out.print("[" + name + "]" + " :"); 89 for(Integer key : player){ 90 String value = pooker.get(key); 91 System.out.print(value+" "); 92 } 93 System.out.println(); 94 } 95 } 96 97 98 /* 99 以上代码执行结果如下: 100 [尹正杰] :大王 梅花2 红桃A 梅花A 方块A 梅花K 方块K 红桃J 方块J 方块9 红桃8 红桃7 梅花7 方块7 方块4 梅花3 方块3 101 [刘亦菲] :小王 黑桃2 红桃2 方块2 黑桃A 黑桃K 黑桃Q 梅花10 红桃9 方块8 黑桃5 红桃5 方块5 黑桃4 梅花4 黑桃3 红桃3 102 [邓紫棋] :红桃K 红桃Q 梅花Q 方块Q 黑桃J 梅花J 黑桃10 方块10 黑桃9 梅花9 黑桃8 梅花8 黑桃7 黑桃6 红桃6 方块6 梅花5 103 [底牌] :红桃10 红桃4 梅花6 104 */
六.集合的总结
给大家推荐一款画图软件,百度脑图。它是一款很好使的画图工具,可以把我们学习的知识点进行归纳整理,下面我就抛砖引玉一下,给大家做个案例: