java基础<集合框架——Map集合>

时间:2021-09-26 19:44:44


Map概述

一、概述

此接口是 Java Collections Framework 的成员。

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

Map又被叫做——双列集合

二、Map集合共性功能

1.添加

pub(K key,V value)

putAll(Map<? extends K , ? extends V> m)

2.删除

clear()

remove(Object key)

3.判断

containsValue(Object value)

containsKey(Object key)

isEmpty()

4.获取

get(Object key)

size()

values()

 

entrySet()

keySet()

三、Map集合分类

1.Hashtable

底层是哈希表数据结构,不可以存入null键和null值,该集合是线程同步的。(用作键的对象必须实现 hashCode 方法和 equals 方法。)

2.HashMap

底层是哈希表数据结构,允许使用null键和null值,该集合是不同步的。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)

3.TreeMap

底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序

 

*****Map和Set很像,因为Set集合底层就是使用了Map集合*****

Map集合共性方法

一、代码 PS:上一节中提到的Map集合众多共性方法中,只对 keySet( )和  entrySet() 方法做代码解释 1.keySet() ——返回该Map集合的键值Set集合
import java.util.*;
class MapDemo
{
public static void main(String[] args)
{
Map<String,String> map=new HashMap<String,String>();
map.put("1","zhangsan");
map.put("2","lisi");
map.put("3","wangzu");

Set<String> keySet=map.keySet();

Iterator<String> it=keySet.iterator();
while(it.hasNext())
{
System.out.println(map.get(it.next()));
}
}
}
2.entrySet()
import java.util.*;
class MapDemo2
{
public static void main(String[] args)
{
Map<String,String> map=new HashMap<String,String>();
map.put("1","zhangsan");
map.put("2","lisi");
map.put("3","wangzu");

Set<Map.Entry<String,String>> entrySet=map.entrySet();

Iterator<Map.Entry<String,String>> it=entrySet.iterator();
while(it.hasNext())
{
Map.Entry<String,String> entry=it.next();
System.out.println(entry.getKey()+"..."+entry.getValue());
}
}
}

Map练习(HashMap和TreeMap)

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

1.描述学生。
2.定义map容器,将学生作为键,地址作为值,存入。
3.获取map集合中的元素。
二、代码
import java.util.*;

class Student implements Comparable<Student>
{
private String name;
private int age;


public int compareTo(Student s)
{
if(s.age==this.age)
return this.name.compareTo(s.name);
return new Integer(this.age).compareTo(new Integer(s.age));

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

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 s.name.equals(this.name)&&s.age==this.age;

}

public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+":"+age;
}
}


class TreeMapPractiseDemo
{
public static void main(String[] args)
{
TreeMap<Student,String> hm=new TreeMap<Student,String>();
hm.put(new Student("zhangsan",12),"山东");
hm.put(new Student("lisi",14),"天津");
hm.put(new Student("wangwu",15),"上海");
hm.put(new Student("zhaoliu",11),"辽宁");
hm.put(new Student("zhaoliu",11),"北京");//将原来相同Student对象取代
Set<Student> set=hm.keySet();
Iterator<Student> it=set.iterator();
while(it.hasNext())
{
Student s=it.next();
System.out.println(s.getName()+":"+s.getAge()+"___"+hm.get(s));
}

Set<Map.Entry<Student,String>> set1=hm.entrySet();
Iterator<Map.Entry<Student,String>> it1=set1.iterator();
while(it1.hasNext())
{
Map.Entry<Student,String> me=it1.next();
System.out.println(me.getKey().getName()+":"+me.getKey().getAge()+"————"+me.getValue());
}

}
}

TreeMap练习——字母出现的次数

一、练习”isdjifsakdjsakdj"获取该字符串中的字母的出现次数。
希望打印结果:a(1)c(2)
二、分析通过结果发现,每一个字母都有对应的次数,说明字母和次数之间都有映射关系。
三、思路1.将字符串转换成字符数组,因为要对每一个字母进行操作。
2.定义一个map集合,因为打印结果的字母有顺序,所以使用Treemap集合。
3.遍历字符数组。
将每一个字母作为键去查map集合。
如果返回null,将该字母和1存入到map集合中。
如果返回不是null,说明该字母在map集合已经存在并有对应次数,那么就获取这个次数并自增1,让后将该字母和自增1后的数据继续存入TreeMap
4.将map集合中的数据变成指定的字符串形式返回。
四、代码
import java.util.*;
class TreeMapNumberDemo
{
public static void main(String[] args)
{
String str="isdjifsakdjsakdj";
char[] c=str.toCharArray();
TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
for(int i=0;i<c.length;i++)
{
if(tm.get(c[i])==null)
{
tm.put(c[i],1);
}
else
{
int count=tm.get(c[i]);
tm.put(c[i],++count);
}
}
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()+")");
}

System.out.println(sb.toString());


}
}

Map扩展

一、练习一个学校有四个班级——1班,2班,3班,4班
每个班级都有30名学生,他们有各自的年龄和学号
用Map集合来描述他们。
二、代码
import java.util.*;

class SchoolMapDemo
{
public static void main(String[] args)
{
TreeMap<String,TreeMap<Integer,String>> school=new TreeMap<String,TreeMap<Integer,String>>();
TreeMap<Integer,String> class1=new TreeMap<Integer,String>();
TreeMap<Integer,String> class2=new TreeMap<Integer,String>();
TreeMap<Integer,String> class3=new TreeMap<Integer,String>();
TreeMap<Integer,String> class4=new TreeMap<Integer,String>();
school.put("1班",class1);
school.put("2班",class2);
school.put("3班",class3);
school.put("4班",class4);
putStudent(class1);
putStudent(class2);
putStudent(class3);
putStudent(class4);

//getStudentsOfClass("1班",school);
getStudentsOfSchool(school);


}

public static void getStudentsOfSchool(TreeMap<String,TreeMap<Integer,String>> school)
{
Set<Map.Entry<String,TreeMap<Integer,String>>> set=school.entrySet();
Iterator<Map.Entry<String,TreeMap<Integer,String>>> it=set.iterator();
while(it.hasNext())
{
Map.Entry<String,TreeMap<Integer,String>> me=it.next();
getStudentsOfClass(me.getKey(),school);
}

}


public static void putStudent(TreeMap<Integer,String> class1)
{
class1.put(01,"zhangsan");
class1.put(02,"lisi");
class1.put(03,"wangwu");
class1.put(04,"zhaoliu");
}



public static void getStudentsOfClass(String name,TreeMap<String,TreeMap<Integer,String>> school)
{
if(school.get(name)==null)
{
System.out.println("您输入的教室不存在");
}
else
{
TreeMap<Integer,String> tm=school.get(name);
Set<Map.Entry<Integer,String>> set=tm.entrySet();
Iterator<Map.Entry<Integer,String>> it=set.iterator();
while(it.hasNext())
{
Map.Entry<Integer,String> ke=it.next();
System.out.println(name+"——"+ke.getKey()+":"+ke.getValue());
}
}
}
}