java----集合类

集合类
一、Map集合
Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性。
1.添加
V put(K key, V value);将指定的值与此映射中的指定键关联(可选操作)。
void putAll(Map<? extends K,? extends V> m);从指定映射中将所有映射关系复制到此映射中(可选操作)。
2.删除
void clear();从此映射中移除所有映射关系(可选操作)。 
V remove(Object key);如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 
3.判断
boolean containsKey(Object key);如果此映射包含指定键的映射关系,则返回 true。 
boolean containsValue(Object value);如果此映射将一个或多个键映射到指定值,则返回 true。
boolean isEmpty();如果此映射未包含键-值映射关系,则返回 true。 
4.获取
V get(Object key);返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 
int size();返回此映射中的键-值映射关系数。 
Collection<V> values();返回此映射中包含的值的 Collection 视图。 
Set<Map.Entry<K,V>> entrySet();返回此映射中包含的映射关系的 Set 视图。 
Set<K> keySet();返回此映射中包含的键的 Set 视图。
Map
|——Hashtable:底层是哈希表数据结构,不可以存入null键和null值,该集合是线程同步的,效率低。
|——HashMap:底层是哈希表数据结构,可以使用nullnull值。该集合是线程不同步的。效率高。
|——TreeSet:底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序。
发现:和Set集合很像。其实Set底层就是使用了Map集合。
import java.util.*;
class Demo
{
	public static void main(String []args){
		HashMap<String,String> map = new HashMap<String,String>();
		//添加元素,如果出现相同键,那么后添加的值会覆盖掉原有键所对应的值,并put方法会返回被覆盖

的值
		map.put("01","zhangsan1");
		map.put("02","zhangsan2");
		map.put("03","zhangsan3");
		//判断
		System.out.println("containsKey : "+map.containsKey("02"));
		//删除
		System.out.println("remove : "+map.remove("02"));
		//获取
		System.out.println("get : "+map.get("023"));//可以通过get方法的返回值判断一个键是否存在
		map.put(null,"haha");//hashMap中允许使用null键null值
		System.out.println("get : "+map.get(null));
		//获取集合中所以的值
		Collection<String> coll = map.values();
		System.out.println(coll);
	}
}

Map集合的两种取出方式
1.Set<K> keySet:将Map中所有的键存入到Set集合。因为Set集合具备迭代器,所以可以通过迭代方式取出所有的键,再根据get方法获取每一个键对应的值。
import java.util.*;
class Demo
{
	public static void main(String []args){
		HashMap<String,String> map = new HashMap<String,String>();
		map.put("01","java01");
		map.put("02","java02");
		map.put("03","java03");
		map.put("04","java04");
		//先获取map集合的所以键的Set集合
		Set<String> set = map.keySet();
		//有了Set集合,就可以获取其迭代器
		Iterator<String> it = set.iterator();
		while(it.hasNext()){
			String key = it.next();
			//有了键,就可以通过map集合的get方法获取对应的值
			String value = map.get(key);
			System.out.println(key+"..."+value);
		}
	}
}

取出原理:图解

keySet取出Map的键的Set集合,再通过Set集合的迭代器,取出Set集合中的键。通过Mapget(key)方法获取键的对应值。
2.Set<Map.Entry<K,V>> entrySet:将Map集合中的映射关系存入到了Set集合中,而这个关系的数据类型就是:Map.Entry
import java.util.*;
class Demo
{
	public static void main(String []args){
		HashMap<String,String> map = new HashMap<String,String>();
		map.put("01","java01");
		map.put("02","java02");
		map.put("03","java03");
		map.put("04","java04");
		//将Map集合中的映射关系取出,存入到Set集合中
		Set<Map.Entry<String,String>> set = map.entrySet();
		Iterator<Map.Entry<String,String>> it = set.iterator();
		while(it.hasNext()){
			Map.Entry<String,String> me = it.next();
			System.out.println(me.getKey()+"..."+me.getValue());
		}
	}
}

取出原理:图解

关系对象Map.Entry获取到后,就可以通过Map.Entry中的getKeygetValue方法获取关系中的键和值。Map.Entry其实是一个接口,它是Map接口中的一个内部接口。
练习:每个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
:姓名年龄相同的视为同一个学生。保证学生的唯一性。
1.描述学生。
2.定义map容器。将学生作为键,地址作为值存入map。
3.获取map集合中的元素。
import java.util.*;
class Student implements Comparable<Student>
{
	private String name;
	private int age;
	Student(String name,int age){
		this.name = name;
		this.age = age;
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
	public int compareTo(Student s){
		int num = name.compareTo(s.name);
		if(num==0)
			return new Integer(age).compareTo(new Integer(s.age));
		return num;
	}
	public int hashCode(){
		return name.hashCode()+age*11;
	}
	public boolean equals(Object obj){
		if(!(obj instanceof Student))
			throw new ClassCastException("不是学生类");
		Student s = (Student)obj;
		return name.equals(s.name)&&age==s.age;
	}
}
class Demo
{
	public static void main(String []args){
		TreeMap<Student,String> tm = new TreeMap<Student,String>();
		tm.put(new Student("lisi3",23),"nanjing");
		tm.put(new Student("lisi2",22),"shanghai");
		tm.put(new Student("lisi4",24),"wuhan");
		tm.put(new Student("lisi1",21),"beijing");
		
		//第一种取出方式
		method_01(tm);
		System.out.println("==========================================");
		//第二种取出方式
		method_01(tm);
	}
	public static void method_01(TreeMap<Student,String> tm){
		Set<Student> set = tm.keySet();
		Iterator<Student> it = set.iterator();
		while(it.hasNext()){
			Student s = it.next();
			String addr = tm.get(s);
			System.out.println("name:"+s.getName()+",age:"+s.getAge()+",addr:"+addr);
		}
	}
	public static void method_02(TreeMap<Student,String> tm){
		Set<Map.Entry<Student,String>> set = tm.entrySet();
		Iterator<Map.Entry<Student,String>> it = set.iterator();
		while(it.hasNext()){
			Map.Entry<Student,String> me = it.next();
			Student s = me.getKey();
			String addr = me.getValue();
			System.out.println("name:"+s.getName()+",age:"+s.getAge()+",addr:"+addr);
		}
	}
}

疑问什么时候使用Map集合呢
答:当数据之间存在着映射关系时,就要先想到Map集合。
练习:"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。希望打印结果:a(1)c(2)......
通过结果发现,每一个字母都有对应的次数,说明字母和次数之间都有映射关系。
:当发现有映射关系时,可以选择Map集合。因为Map集合中存放的就是映射关系。

分析:第一次字母a作为键去找集合,那么集合没有a这个键,就将a字母和1存入集合。如果指定的键已经存在,说明有对应的次数,就将对应的次数取出,并自增后再重新存入集合。
思路
1.将字符串转换成字符数组,因为要对每一个字母进行操作。
2.定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMap集合。
3.遍历字符数组。将每一个字母作为键去查找Map集合。如果返回null就将该字母和1存入到Map集合中,如果返回的不是null,说明该字母在Map集合中已经存在,并有对应的次数,那么就获取该次数并进行自增,然后将该字母和自增后的次数存到Map集合中,覆盖掉原来键所对应的值。
4.将Map集合中的数据变成指定的字符串形式返回。
import java.util.*;
class Demo
{
	public static void main(String []args){
		String s = "sdfgzxcvasdfxcvdf";
		show(s);
		show(charCount(s));
	}
	public static String charCount(String s){
		TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
		char []chs = s.toCharArray();
		for(int x=0;x<chs.length;x++){
			Integer value = tm.get(chs[x]);
			if(value==null)
				tm.put(chs[x],1);
			else{
				tm.put(chs[x],value+1);
			}
		}
		StringBuilder sb = new StringBuilder();
		Set<Map.Entry<Character,Integer>> set = tm.entrySet();
		Iterator<Map.Entry<Character,Integer>> it = set.iterator();
		while(it.hasNext()){
			Map.Entry<Character,Integer> me = it.next();
			sb.append(me.getKey()+"("+me.getValue()+")");
		}
		return sb.toString();
	}
	public static void show(String str){
		System.out.println(str);
	}
}

扩展知识:描述复杂关系
图示:描述学校,教室,学生的关系。

import java.util.*;
class Demo
{
	public static void main(String []args){
		HashMap<String,HashMap<String,String>> czbk = new HashMap<String,HashMap<String,String>>();
		HashMap<String,String> jiuye = new HashMap<String,String>();
		HashMap<String,String> yure = new HashMap<String,String>();
		czbk.put("yureban",yure);
		czbk.put("jiuyeban",jiuye);

		yure.put("01","zhangsan");
		yure.put("02","lisi");

		jiuye.put("01","zhaoliu");
		jiuye.put("02","wangwu");
		
		showSchoolRoom(czbk);
	}
	public static void showRoomStu(HashMap<String,String> room){
		Set<Map.Entry<String,String>> set = room.entrySet();
		Iterator<Map.Entry<String,String>> it = set.iterator();
		while(it.hasNext()){
			Map.Entry<String,String> me = it.next();
			System.out.println("ID : "+me.getKey()+" , Name :"+me.getValue());
		}
	}
	
	public static void showSchoolRoom(HashMap<String,HashMap<String,String>> school){
		Set<Map.Entry<String,HashMap<String,String>>> set = school.entrySet();
		Iterator<Map.Entry<String,HashMap<String,String>>> it = set.iterator();
		while(it.hasNext()){
			Map.Entry<String,HashMap<String,String>> me = it.next();
			System.out.println("Class : "+me.getKey());
			showRoomStu(me.getValue());
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值