Java基础_集合(Map类)


一、集合(Map概述)

java.util 

接口 Map<K,V>

类型参数:

K - 此映射所维护的键的类型

V - 映射值的类型

Map

|--Hashtable

|--HashMap

|--TreeMap

1.添加

put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。

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子类对象特点)

Map

|--Hashtable:底层是哈希表数据结构,不可以存入nullnull值。该集合线程同步。jdk1.0   率低

|--HashMap:底层是哈希表数据结构,允许使用nullnull值。该集合线程不同步。jdk1.2 效率高

|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的健进行排序。

MapSet很像,其实Set底层就是使用了Map集合。

三、集合(Map共性方法)

/*
Map共性方法:
*/
import java.util.*;
class MapDemo 
{
	public static void main(String[] args) 
	{
		Map<String,String> map=new HashMap<String,String>();
		/*添加元素,如果出现添加时有相同的健,那么后添加的值会覆盖原有键对应的值。
		并且put会返回原有健的值。
		*/
		System.out.println(map.put("001","张三"));
		System.out.println(map.put("001","zhangsan"));
		map.put("002","李四");
		map.put("003","王五");

		System.out.println("containsKey:"+map.containsKey("002"));

		System.out.println("remove:"+map.containsKey("0021"));
		System.out.println("remove:"+map.remove("002"));

		System.out.println(map);

		System.out.println("get:"+map.get("0012"));//可以通过get方法的返回值来判断一个键是否存在。
		
		Collection<String> coll=map.values();
		System.out.println(coll);
		System.out.println(map);
	}
}


四、集合(Map-keySet)

/*
Map集合的两种取出方式:

1. Set<k> keySet():将Map中所有的键存入Set集合。因为Set具备迭代器。
所以可以用迭代的方式取出所有的健,再根据get方法获取每个键对应的值。

Map集合的取出原理:将Map集合转成Set集合,再通过迭代器取出。

*/
import java.util.*;
class MapDemo2 
{
	public static void main(String[] args) 
	{
		Map<String,String> map=new HashMap<String,String>();

		map.put("001","张三");
		map.put("002","李四");
		map.put("003","王五");
		map.put("004","小明");

		
		Set<String> keySet=map.keySet();//获取map集合所有键的Set集合,keySet();

		Iterator<String> it=keySet.iterator();

		while(it.hasNext())
		{
			String key=it.next();
			String value=map.get(key);
			System.out.println("key:"+key+"\tvalue:"+value);
		}
	}
}


五、集合(Map-entrySet)

/*
map集合的两种取出方式:

2.Set<Map.Entry<K,V>>entrySet():将Map集合中的映射关系存入Set集合中,而这个关系的
数据类型是:Map.Entry

Map.Entry其实Entry也是一个接口,他是Map接口中的内部接口。

interface Map
{
	public static interface Entry
	{
		public abstract Object getKey();
		public abstract Object getValue();
	}
}

class HashMap implements Map
{
	class Hahs implements Map.Entry
	{
		public abstract Object getKey(){}
		public abstract Object getValue(){}
	}
}	

*/
import java.util.*;
class MapDemo2 
{
	public static void main(String[] args) 
	{
		Map<String,String> map=new HashMap<String,String>();

		map.put("001","张三");
		map.put("002","李四");
		map.put("003","王五");
		map.put("004","小明");

		
		Set<Map.Entry<String,String>> entrySet=map.entrySet();//将Map集合中的映射关系取出存入Set集合中。

		Iterator<Map.Entry<String,String>> it=entrySet.iterator();

		while(it.hasNext())
		{
			Map.Entry<String,String> me=it.next();
			String key=me.getKey();
			String value=me.getValue();
			System.out.println("key:"+key+"\tvalue:"+value);
		}
	}
}


六、集合(Map练习)

/*
每个学生都有对应的归属地。
学生Student 地址String
学生属性:姓名,年龄
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。

1.描述学生。
2.定义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 int compareTo(Student s)
	{
		int num=new Integer(this.age).compareTo(new Integer(s.age));
		if(num==0)
			return this.name.compareTo(s.name);
		return num;
	}

	public int hashCode()
	{
		return name.hashCode()+age*34;
	}
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不匹配");

		Student s=(Student)obj;
		return this.name.equals(s.name)&&this.age==s.age;
	}
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	public String toString()
	{
		return name+":"+age;
	}
}

class MapTest 
{
	public static void main(String[] args) 
	{
		HashMap<Student,String> hm=new HashMap<Student,String>();

		hm.put(new Student("zhangsan01",20),"beijing");
		hm.put(new Student("zhangsan02",23),"shanghai");
		hm.put(new Student("zhangsan03",24),"nanjing");
		hm.put(new Student("zhangsan04",22),"wuhan");

		//第一种取出方式:

		Set<Student> keySet=hm.keySet();
		Iterator<Student> it=keySet.iterator();

		while(it.hasNext())
		{
			Student stu=it.next();
			String addr=hm.get(stu);
			System.out.println("姓名:"+stu.getName()+"\t年龄:"+stu.getAge()+"\t地址:"+addr);
		}

		//第二种取出方式:
		
		Set<Map.Entry<Student,String>> entrySet=hm.entrySet();
		Iterator<Map.Entry<Student,String>> itr=entrySet.iterator();
		while(itr.hasNext())
		{
			Map.Entry<Student,String> me=itr.next();
			Student stu=me.getKey();
			String addr=me.getValue();
			System.out.println("姓名:"+stu.getName()+"\t年龄:"+stu.getAge()+"\t地址:"+addr);
		}
	}
}


七、集合(TreeMap练习)

/*
需求:对学生对象的年龄进行升序排序。

因为数据是以键值对的形式存在的,所以要使用判续的Map集合TreeMap
*/
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 int compareTo(Student s)
	{
		int num=new Integer(this.age).compareTo(new Integer(s.age));
		if(num==0)
			return this.name.compareTo(s.name);
		return num;
	}

	public int hashCode()
	{
		return name.hashCode()+age*34;
	}
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不匹配");

		Student s=(Student)obj;
		return this.name.equals(s.name)&&this.age==s.age;
	}
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	public String toString()
	{
		return name+":"+age;
	}
}
class StuNameComparator implements Comparator<Student>
{
	public int compare(Student s1,Student s2)
	{
		int num=s1.getName().compareTo(s2.getName());
		if(num==0)
			return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
		
		return num;
	}
}
class MapTest2 
{
	public static void main(String[] args) 
	{
		TreeMap<Student,String> tm=new TreeMap<Student,String>(new StuNameComparator());

		tm.put(new Student("zhangsan01",20),"beijing");
		tm.put(new Student("zhangsan03",24),"nanjing");
		tm.put(new Student("zhangsan02",23),"shanghai");
		tm.put(new Student("zhangsan04",22),"wuhan");
		tm.put(new Student("zhangsan04",20),"wuhan");

		Set<Map.Entry<Student,String>> entrySet=tm.entrySet();
		Iterator<Map.Entry<Student,String>> it=entrySet.iterator();

		while(it.hasNext())
		{
			Map.Entry<Student,String> me=it.next();
			Student stu=me.getKey();
			String addr=me.getValue();
			System.out.println(stu+"..."+addr);
		}
	}
}


八、集合(TreeMap练习-字母出现的次数)

/*
练习:
"asfdjhsadkjfhskfsad"获取该字符串中的字母出现的次数。
打印形式:a(1)b(2)....

通过结果发现,每一个字母都有对应的次数。
说明字母和次数之间都有映射关系。
注意:
当发现有映射关系时,可以选择Map集合。因为Map集合中存放的就是映射关系。

什么时候使用Map集合呢?
当数据之间存在着映射关系时,就要先想到Map集合。

思路:
1.将字符串转换为字符数组。
2.定义一个Map集合,因为打印结构的字母有顺序,所以使用TreeMap集合
3.遍历字符数组。将每一个字母作为键去查Map集合。如果返回null,将
该字母和1存入到Map集合中。如果返回不是null,说明该字母在Map集合已经
存在并有对应的次数。那么就获取该次数并进行自增,然后将字母和自增后的次序
数存入到Map集合中,覆盖掉原来键所对应的值。
4.将Map集合中的数据编程指定的字符串形式返回。

*/
import java.util.*;
class MapTest3 
{
	public static void main(String[] args) 
	{
		String s=charCount("asdasd");
		System.out.println(s);
	}
	public static String charCount(String str)
	{
		int count=0;

		char[] chs=str.toCharArray();

		TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();

		for(int i=0;i<chs.length;i++)
		{
			if(!(chs[i]>='a'&&chs[i]<='z'||chs[i]>='A'&&chs[i]<='Z'))
				continue;


			Integer value=tm.get(chs[i]);

			if(value!=null)
				count=value;
			count++;
			tm.put(chs[i],count);

			count=0;//清0
			/*
			if(value==null)
			{
				tm.put(chs[i],1);
			}
			else
			{
				value=value+1;
				tm.put(chs[i],value);
			}
			*/
		}
		StringBuilder sb=new StringBuilder();

		Set<Map.Entry<Character,Integer>> entrySet=tm.entrySet();
		Iterator<Map.Entry<Character,Integer>> it=entrySet.iterator();

		while(it.hasNext())
		{
			Map.Entry<Character,Integer> me=it.next();
			Character ch=me.getKey();
			Integer value=me.getValue();
			sb.append(ch+"("+value+")");
		}

		return sb.toString();
	}
}


九、集合(Map扩展)

/*
Map扩展知识:

Map集合被使用是因为具备映射关系。

1.
"yureban" "01" "zhangsan"
"yureban" "02" "lisi"
"jiuyeban" "01" "wangwu"
"jiuyeban" "02" "zhaoliu"


2.
"yureban" Student("01" "zhangsan")
"yureban" Student("02" "lisi")
"jiuyeban" Student("01" "wangwu")
"jiuyeban" Student("02" "zhaoliu")


一个学校有多个教室,每个教室有个名称。

*/
import java.util.*;
class Student
{
	private String id;
	private String name;
	Student(String id,String name)
	{
		this.id=id;
		this.name=name;
	}
	public String toString()
	{
		return "学号:"+id+"\t姓名:"+name;
	}
}
class MapDemo3 
{
	public static void main(String[] args) 
	{
		
		System.out.println("1.");

		HashMap<String,String> yure=new HashMap<String,String>();
		
		yure.put("0001","张三");
		yure.put("0002","李四");

		HashMap<String,String> jiuye=new HashMap<String,String>();
		
		jiuye.put("0001","王五");
		jiuye.put("0002","赵六");

		HashMap<String,HashMap<String,String>> czbk=new HashMap<String,HashMap<String,String>>();
		czbk.put("预热班",yure);
		czbk.put("就业班",jiuye);

		//遍历czbk集合。获取所有的教室
		Iterator<String> it=czbk.keySet().iterator();
		while(it.hasNext())
		{
			String roomName=it.next();
			HashMap<String,String> room=czbk.get(roomName);

			System.out.println(roomName);
			getStudentInfo(room);
		}

		System.out.println("2.");
		demo();
	}
	public static void demo()
	{
		HashMap<String,List<Student>> czbk=new HashMap<String,List<Student>>();
		List<Student> yure=new ArrayList<Student>();
		List<Student> jiuye=new ArrayList<Student>();

		czbk.put("预热班",yure);
		czbk.put("就业班",jiuye);

		yure.add(new Student("0001","张三"));
		yure.add(new Student("0002","李四"));

		jiuye.add(new Student("0001","王五"));
		jiuye.add(new Student("0002","赵六"));


		Iterator<String> it=czbk.keySet().iterator();
		while(it.hasNext())
		{
			String roomName=it.next();
			List<Student> room=czbk.get(roomName);

			System.out.println(roomName);
			getInfos(room);
		}
	}
	public static void getInfos(List<Student> list)
	{
		Iterator<Student> it=list.iterator();
		while(it.hasNext())
		{
			Student s=it.next();
			System.out.println(s);
		}
	}
	public static void getStudentInfo(HashMap<String,String> roomMap)
	{
		Iterator<String> it=roomMap.keySet().iterator();
		while(it.hasNext())
		{
			String id=it.next();
			String name=roomMap.get(id);
			System.out.println("学号:"+id+"\t姓名:"+name);
		}
	}
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值