码迷,mamicode.com
首页 > 其他好文 > 详细

集合详解(五):集合嵌套与Collections工具类

时间:2015-05-13 21:59:04      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:二分查找   hashmap   arraylist   collections   

一、集合嵌套

1、HashMap嵌套HashMap
<span style="font-size:18px;">	/*
	 * HashMap嵌套HashMap
	 * 
	 * 传智播客
	 * 		jc	基础班
	 * 				陈玉楼		20
	 * 				高跃		22
	 * 		jy	就业班
	 * 				李杰		21
	 * 				曹石磊		23
	 * 
	 * 先存储元素,然后遍历元素
	 */
	public void test3(){
		
		// 创建集合对象
		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){
				Integer czbkMapValueValue = czbkMapValue.get(czbkMapValueKey);
				System.out.println("\t"+czbkMapValueKey+"---"+czbkMapValueValue);
			}
		}
		
	}</span>


2、HashMap集合的值是ArrayList
<span style="font-size:18px;">	/*
	 *需求:
	 *假设HashMap集合的元素是ArrayList。有3个。
	 *每一个ArrayList集合的值是字符串。
	 *元素我已经完成,请遍历。
	 *结果:
	 *		 三国演义
	 *		 	吕布
	 *		 	周瑜
	 *		 笑傲江湖
	 *		 	令狐冲
	 *		 	林平之
	 *		 神雕侠侣
	 *		 	郭靖
	 *		 	杨过  
	 */
	public void test4(){
		// 创建集合对象
		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(String key : set){
			System.out.println(key);
			ArrayList<String> value = hm.get(key);
			for(String s : value){
				System.out.println("\t"+s);
			}
		}
	}</span>

3、ArrayList集合嵌套HashMap
<span style="font-size:18px;">	/*
	 ArrayList集合嵌套HashMap集合并遍历。
	 需求:
	 假设ArrayList集合的元素是HashMap。有3个。
	 每一个HashMap集合的键和值都是字符串。
	 元素我已经完成,请遍历。
	 结果:
	 周瑜---小乔
	 吕布---貂蝉

	 郭靖---黄蓉
	 杨过---小龙女

	 令狐冲---任盈盈
	 林平之---岳灵珊
	 */
	public void test5(){
		
		// 创建集合对象
		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) {
				String value = hm.get(key);
				System.out.println(key + "---" + value);
			}
		}
	}
	</span>

4、多层嵌套
<span style="font-size:18px;">	/*
	 * 为了更符合要求:
	 * 		这次的数据就看成是学生对象。
	 * 
	 * 学校
	 * 		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
	 */
	public void test6(){
		
		// 创建大集合
		HashMap<String, HashMap<String, ArrayList<Student>>> czbkMap = new HashMap<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());
				}
			}
		}
	}</span>


二、Collections工具类

(一)概述
1、Collections:是针对集合进行操作的工具类,都是静态方法。
2、Collection和Collections的区别:
1)Collection:是单列集合的顶层接口,有子接口List和Set。
2)Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法

(二)方法
1、方法:
1)public static <T> void sort(List<T> list):排序,默认情况下是自然顺序。
2)public static <T> int binarySearch(List<?> list,T key):二分查找
3)public static <T> T max(Collection<?> coll):最大值
4)public static void reverse(List<?> list):反转
5)public static void shuffle(List<?> list):随机置换


2、实例
1)方法实例
<span style="font-size:18px;">	/*
	 * Collections:是针对集合进行操作的工具类,都是静态方法。
	 * 
	 * 面试题: Collection和Collections的区别? Collection:是单列集合的顶层接口,有子接口List和Set。
	 * Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法
	 * 
	 * 要知道的方法 public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。 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 void test1() {

		// 创建集合对象
		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);

		// 排序
		Collections.sort(list);// 排序 默认情况下是自然顺序。
		System.out.println("list:" + list); // [10, 20, 30, 40, 50]

		// 二分查找
		System.out.println("binarySearch:" + Collections.binarySearch(list, 30));
		System.out.println("binarySearch:" + Collections.binarySearch(list, 300));// -6(找不到,即负的最大索引+1)

		// 最值
		System.out.println("max:" + Collections.max(list));// 50
		System.out.println("max:" + Collections.min(list));// 10

		// 反转,逆序
		Collections.reverse(list);
		System.out.println("list:" + list);

		// 随机置换(扑克牌)
		Collections.shuffle(list);
		System.out.println("list:" + list);

	}
</span>


2)排序实例
<span style="font-size:18px;">	/**
	 * Collections可以针对ArrayList存储基本包装类的元素排序,
	 * 存储自定义对象排序,需要实现Comparator接口或Comparable接口
	 */
	public void test2() {
		// 创建集合对象
		List<Student> list = new ArrayList<Student>();

		// 创建学生对象
		Student s1 = new Student("林青霞", 27);
		Student s2 = new Student("风清扬", 30);
		Student s3 = new Student("刘晓曲", 28);
		Student s4 = new Student("武鑫", 29);
		Student s5 = 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
			public int compare(Student s1, Student s2) {
				int num = s2.getAge() - s1.getAge();
				int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
				return num2;
			}
		});

		// 遍历集合
		for (Student s : list) {
			System.out.println(s.getName() + "---" + s.getAge());
		}
	}
</span>

2)模拟发牌

方法一:使用arraylist

<span style="font-size:18px;">	/*
	 * 模拟斗地主洗牌和发牌
	 * 
	 * 分析: A:创建一个牌盒 B:装牌 C:洗牌 D:发牌 E:看牌
	 */
	public void test3() {
		// 创建一个牌盒
		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);
	}

	public static void lookPoker(String name, ArrayList<String> array) {
		System.out.print(name + "的牌是:");
		for (String s : array) {
			System.out.print(s + " ");
		}
		System.out.println();
	}
</span>

方法二:使用hashMap 和TreeSet

<span style="font-size:18px;">	/*
	 * 思路: A:创建一个HashMap集合 
	 * B:创建一个ArrayList集合 
	 * C:创建花色数组和点数数组
	 * D:从0开始往HashMap里面存储编号,并存储对应的牌 同时往ArrayList里面存储编号即可。 
	 * E:洗牌(洗的是编号)
	 * F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
	 * G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
	 */
	public void test4() {
		// 创建一个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里面存储编号即可。
		int index = 0;

		for (String number : numbers) {
			for (String color : colors) {
				String poker = 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);
	}

	// 写看牌的功能
	public static void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {
		System.out.print(name + "的牌是:");
		for (Integer key : ts) {
			String value = hm.get(key);
			System.out.print(value + " ");
		}
		System.out.println();
	}
</span>



集合详解(五):集合嵌套与Collections工具类

标签:二分查找   hashmap   arraylist   collections   

原文地址:http://blog.csdn.net/u012228718/article/details/45697321

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!