1 TreeMap的两种遍历方式

     思路1:键值对对象找键和值方式

         entrySet()方法:获取键值对对象 ,把键和值封装起来看做一个对象
 1)获取所有键值对对象的集合---entrySet()方法
 2)遍历键值对对象的集合,获取到每一个键值对对象---foreach遍历
 3)根据键值对的得到键和值---getKey()和getValue()方法
    思路2:键找值方式
 1)获取所有键的集合----keySet()
 2)遍历键的集合,获取到每一个键---foreach遍历→注意判断是否非空
 3)根据键找值----get(K key)→value
实例1

 

package demo;

import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

/**
 * @author Orange
 * @version 1.8
 */
// 测试类
public class Test01 {
	public static void main(String[] args) {
		TreeMap<Integer, Student> tm = new TreeMap<Integer, Student>();
		method1(tm);//方式1
		System.out.println("---------------");
		method2(tm);//方式2
		tm.put(1, new Student("小花", 18));
		tm.put(2, new Student("小兰", 17));
		tm.put(3, new Student("阿迪", 19));
		/**
		 * 思路:将集合转化为数组进行遍历
		 * 错误:Map是双列集合,无法直接转换成toArray形式
		 * 此种思路pass
		 */
		
	}

	/**
	 * @param tm
	 *     方式2---利用TreeMap本身的keySet得到键对象,进而用get(K key)得到值对象
	 */
	private static void method2(TreeMap<Integer, Student> tm) {
		tm.put(1, new Student("小花", 18));
		tm.put(2, new Student("小兰", 17));
		tm.put(3, new Student("阿迪", 19));
		/*
		 * for(<Integer, Student> s:tm){
			System.out.println(s);
		}
		错误:原来想通过这种方式,遍历元素
		只有通过键值对的方法才能遍历
		*/
		Set<Integer> keySet = tm.keySet();
		/** 
		 * 思路2:-----键找值方式
		 * 1)获取所有键的集合----keySet()
		 * 2)遍历键的集合,获取到每一个键---foreach遍历
		 * 3)根据键找值----get(K key)→value
		 * */
		for(Integer integer:keySet){
			System.out.println(integer);
			Student student = tm.get(integer);
			System.out.println("\t"+student.getName()+"---"+student.getAge());
		}
	}

	/**
	 * @param tm
	 *       方式1--利用entrySet()方法去遍历Map集合中的元素
	 */
	private static void method1(TreeMap<Integer, Student> tm) {
		tm.put(1, new Student("阿花", 18));
		tm.put(2, new Student("阿兰", 17));
		tm.put(3, new Student("阿迪", 19));
		Set<Entry<Integer, Student>> es = tm.entrySet();//重要!!!
		/**
		 * 思路1:---值对对象找键和值方式
		 * entrySet()----键值对对象 ,把键和值封装起来看做一个对象
		 * 1)获取所有键值对对象的集合---entrySet()方法
		 * 2)遍历键值对对象的集合,获取到每一个键值对对象---foreach遍历
		 * 3)根据键值对的得到键和值---getKey()和getValue()方法
		 */
		for(Entry<Integer, Student> e:es){
			System.out.println(e.getKey());
			Student student = e.getValue();
			/**
			 * 原来错误思路:对获取的键值竟然妄想去用foreach遍历
			 * foreach遍历:集合或数组
			 * 哎,差得码子大!!!
			 */
			System.out.print("\t"+student.getName()+"---"+student.getAge()+"\r");
		}
	}
}

说明:将两种方法分别封装到方法里面

 

2  HashMap和TreeMap的get()方法的应用

实例2

 

package demo;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

/**
 * @author Orange
 * @version 1.8
 */

public class Test02 {
	/**
	 * 
	 * 练习1:需求:统计字符串中每个字符出现的次数----HashMap
	 * "aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
	 * 练习2:需求:将字符串中的字符按照先后a-z的方式进行排序----TreeMap
	 * 如果bdadabcc-----结果:a(2)b(2)c(2)d(2)
	 */
	/**
	 * 分析:分析字符串,再观察字符串要求的结果,里面为每个字出现的次数
	 * 大方法思路:创建一个StringBuilder的对象利用append()方法拼接字符'('和')'和次数
	 * 用集合的观点看世界。。。
	 * 通过观察有点像键值对(除了'('和')'),既然决定用键值对,关键是如何如何统计次数
	 * 技巧:通过get()方法的返回值对字符进行计数
	 */
	//1---创建键盘录入对象,输入字符串----字符字符串
	@SuppressWarnings("resource")
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入字符串:");
		String reStr = sc.nextLine();
		//由于是要对字符串中的字符进行计数,转化成字符数组
		char[] charArray = reStr.toCharArray();
		//创建一个集合容器保存键值对对象---字符和对应次数
		exercise1(charArray);//练习1
		exercise2(charArray);//练习2
	}

	/**
	 * @param charArray
	 */
	private static void exercise2(char[] charArray) {
		//由于要进行排序--TreeMap集合
		TreeMap<Character, Integer> tm = new TreeMap<Character,Integer>();
		if(charArray!= null){
			for(char c:charArray){
				//用集合的get()方法判断集合中是否已经有该字符对象
				if(tm.get(c)==null){
					tm.put(c, 1);//如果为null,表示还没有此值对象,将value设置为1
				}else{
					//如果不为null,表示集合中已经有该值对象对应的键对象,只需要对值对象做改变
					Integer value = tm.get(c);//得到当前键的值对象,重新赋值
					tm.put(c, ++value);
				}
			}
		}
		//好了,关键的地方已经弄的差不多了,该创建字符串缓冲区对象了
		//创建StringBuilder的对象
		StringBuilder sb = new StringBuilder();
		//需要对HashMap集合中的键和值遍历出来用append()拼接
		//首先得到"键值对"对应的键和值
		Set<Entry<Character, Integer>> es = tm.entrySet();
		if(es!=null){//foreach缺点:---所以必须进行非空判断
			for(Entry<Character, Integer> s:es){
				//得到键值对对象的键
				Character key = s.getKey();
				//得到键对应的值
				Integer value = s.getValue();
				//下面就是拼接了
				sb.append(key).append("(").append(value).append(")");
			}
		}
		System.out.println(sb);
	}

/**
 * @param charArray
 */
private static void exercise1(char[] charArray) {
	HashMap<Character, Integer> hm = new HashMap<Character,Integer>();
	//对字符数组的字符进行遍历---foreach
	if(charArray!= null){
		for(char c:charArray){
			//用集合的get()方法判断集合中是否已经有该字符对象
			if(hm.get(c)==null){
				hm.put(c, 1);//如果为null,表示还没有此值对象,将value设置为1
			}else{
				//如果不为null,表示集合中已经有该值对象对应的键对象,只需要对值对象做改变
				Integer value = hm.get(c);
				hm.put(c, ++value);
			}
		}
	}
	
	
	//好了,关键的地方已经弄的差不多了,该创建字符串缓冲区对象了
	//创建StringBuilder的对象
	StringBuilder sb = new StringBuilder();
	//需要对HashMap集合中的键和值遍历出来用append()拼接
	//首先得到"键值对"对应的键和值
	Set<Entry<Character, Integer>> es = hm.entrySet();
	if(es!=null){//foreach缺点:---所以必须进行非空判断
		for(Entry<Character, Integer> s:es){
			//得到键值对对象的键
			Character key = s.getKey();
			//得到键对应的值
			Integer value = s.getValue();
			//下面就是拼接了
			sb.append(key).append("(").append(value).append(")");
		}
	}
	System.out.println(sb);
 }
}

说明:代码的冗余度较高,为方便说明,不再简写

 

 

 

3  集合嵌套

 

 3.1集合嵌套之HashMap嵌套ArrayList-----HashMap存储的是ArrayList类型元素

 以如下的方式在控制台打印:
       巨星
               林正英 18
               李小龙 24
一线明星
               冯绍峰 20
               黄海波 24

练习1  Student类

 

package demo;

/**
 * @author Orange
 * @version 1.8
 */
public class Student {
	private String name;
	private int age;

	public Student() {
		super();
		
	}

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

 

测试类

 

package demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/**
 * @author Orange
 * @version 1.8
 */
public class Demo03 {
	/*	
	分析:HashMap键值对存储元素	
	思考:由于java的Map类中允许"值对象"也是Map类型的
	做法:可以将"林正英---18"以键值对的形式来表示,此时不需要Student类了,感兴趣可以自己尝试一下		
	*/
	public static void main(String[] args) {
		//创建两个ArrayList----容器
		ArrayList<Student> al1 = new ArrayList<Student>();
		//储存元素,匿名内部类
		al1.add( new Student("林正英",18));
		al1.add( new Student("李小龙",24));
		
		ArrayList<Student> al2 = new ArrayList<Student>();
		//储存元素,匿名内部类形式
		al2.add( new Student("冯绍峰",20));
		al2.add( new Student("黄海波",24));
		//将集合元素添加到大集合中
		HashMap<String, ArrayList<Student>> hashMap = new HashMap<>();//泛型推断
		hashMap.put("巨星", al1);//al1的对象的类型
		hashMap.put("一线明星", al2);
		//老规矩:遍历先做非空判断
		Set<Entry<String, ArrayList<Student>>> es = hashMap.entrySet();//键值对对象
		if(es!=null){
			for(Entry<String, ArrayList<Student>> s:es){
				String key = s.getKey();//获取
				System.out.println(key);
				ArrayList<Student> value = s.getValue();//获取
				for(Student student:value){//遍历
					System.out.println("\t"+student.getName()+"\t"+student.getName());
				}
			}
		}
		
	}
	
}

 

3.2  HashMap嵌套HashMap

   以上述为例,仍打印上面的内容

 

练习2

 

package demo;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/**
 * @author Orange
 * @version 1.8
 */
public class Demo4 {
	/**
	 * HashMap嵌套HashMap
	 */
	public static void main(String[] args) {
		//创建两个小集合---保存元素
		HashMap<String, Integer> hm1 = new HashMap<String,Integer>();
		hm1.put("林正英",18);
		hm1.put("李小龙",24);
		HashMap<String, Integer> hm2 = new HashMap<String,Integer>();
		hm2.put("冯绍峰",20);
		hm2.put("黄海波",24);
		//创建大集合
		HashMap<String, HashMap<String, Integer>> hashMap = new HashMap<>();
		hashMap.put("巨星", hm1);
		hashMap.put("一线明星", hm2);
		if(hashMap!=null){//其实没必要---hashMap键值都可以是null
			Set<String> keySet = hashMap.keySet();//得到键集合
			if(keySet!=null){                     //非空判断
				for(String s:keySet){         //遍历键集合
					System.out.println(s);
					//根据键获取值
					HashMap<String, Integer> hashMap2 = hashMap.get(s);
					    Set<Entry<String, Integer>> entrySet = hashMap2.entrySet();
					    //对里层的hashMap做遍历,其实还是得做非空判断
						for(Entry<String, Integer> s1:entrySet){
							System.out.println("\t"+s1.getKey()+"---"+s1.getValue());
					}
				}
			}
		}
	}
	
}

说明:Map的值对象还可以是Map类型,但是键对象不可以111

 

3.3 ArrayList之HashMap

 

打印如下内容:

     周瑜---小乔
     吕布---貂蝉

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

     令狐冲---任盈盈
     林平之---岳灵珊

练习3

 

package demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/**
 * @author Orange
 * @version 1.8
 */
public class Demo05 {
	public static void main(String[] args) {
		HashMap<String, String> hashMap1 = new HashMap<String, String>();
		hashMap1.put("周瑜", "貂蝉");
		hashMap1.put("杨过", "杨玉环");
		HashMap<String, String> hashMap2 = new HashMap<String, String>();
		hashMap2.put("郭靖", "杨桃");
		hashMap2.put("吕布", "凤姐");
		HashMap<String, String> hashMap3 = new HashMap<String, String>();
		hashMap3.put("令狐冲", "高圆圆");
		hashMap3.put("林平之", "白晶晶");
		ArrayList<HashMap<String, String>> arrayList = new ArrayList<>();
		arrayList.add(hashMap1);
		arrayList.add(hashMap2);
		arrayList.add(hashMap3);
		if(arrayList!=null){//非空判断
			for(HashMap<String, String> hm:arrayList){//对ArrayList元素遍历
				Set<Entry<String, String>> eS = hm.entrySet();//有两个键值对对象
				for(Entry<String, String> se:eS){//得到每个键值对对象的键和值
					System.out.println(se.getKey()+"---"+se.getValue());
				}
				System.out.println();
			}
		}
	}
}

未完待续......