Map接口
以键值对的形式保存映射关系(key-value),其中key不允许重复因此按照保证键的唯一性的方式Map集合分为两大类:
HashMap:通过键的hashCode()和equals()方法保证键的唯一,其中HashMap中的任何对象包括null都可以作为键值。
TreeMap:通过CompareTo()方法保证键值的唯一;这里有实现比较的方式有两种:在集合元素的对象中实现CompareTo()方法,或者在定义TreeMap时在参数列表里给一个Comparator对象。
Map常用方法
void clear():删除该Map对象中所有的key-value对。也就是清理该集合;
boolean containsKey(Object key):查询Map中是否包含指定的key;
boolean containsValue(Object value):查询Map中是否包含至少一个value;
Set entrySet():返回Map所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map内部类);
Object get(Object key):返回指定key所对应的value,若此Map中不包含该key,返回null;
boolean isEmpty():判断Map集合是否为空;
Set keySet():返回该Map中所有key所组成的Set集合;
Object put(Object key,Object value):添加一个key-value对,若Map中已有与key相等的key-value对,则新的key-value对覆盖原来的key-value对;
void putAll(Map m):将m中的key-value赋值到调用该方法的Map对象中;
Object remove(Object key):删除指定key所对应的key-value对,返回本删除key所关联的value,若key不存在,返回null;
int size():返回该Map里面key-value对的个数;
Map.Entry:Entry是Map接口里面的一个内部接口.该接口用于封装key- value,有3个方法:
Object getKey();返回Entry里包含的key值
Object getValue();返回Entry里包含的value值
Object setValue(Object value):设置Entry里包含的value值,并返回新设置的value值;
Map集合的输出
按照最正统的做法,所有的Map集合的内容都要依靠Iterator输出,以上虽然是完成了输出,但是完成的不标准,Map集合本身并不能直接为Iterator实例化,如果此时非要使用Iterator输出Map集合中内容的话,则要采用如下的步骤:
方法一:
1.通过entrySet方法变成Set对象
2.调用Set的Iterator方法,此时每个Iterator对象是Map.Entry对象
3.对Map.Entry分离出 key - value
方法二:
1.通过keySet得到Map集合多有key的Set集合
2.调用Set的Iterator方法,此时每个Iterator对象是key值
3.通过Map的getValue(key)得到value值
示例代码:
import java.util.*;
public class Demo {
public static void main(String[] args) {
Map<Integer, String> m = new HashMap<Integer, String>();
m.put(1, "jack");
m.put(2, "rose");
m.put(3, "lucy");
//第一种方法
Set s = m.entrySet();
Iterator it = s.iterator();
while(it.hasNext()){
Map.Entry me = (Entry) it.next();
System.out.println(me.getKey()+" "+me.getValue());
}
//第二种方法
s = m.keySet();//得到的是key的集合
it = s.iterator();//然后将key迭代出来
while(it.hasNext()){
int i = (int)it.next();
System.out.println(i+" "+m.get(i));
}
}
}
案例:统计字符串中字母出现的次数
<pre class="java" name="code">
package itheima;
import java.util.*;
class MyComparator implements Comparator //定义比较器
{
Map tr;
public MyComparator(Map map)
{
this.tr=map;
}
public int compare(Object o1,Object o2)
{
Character c1=(Character)o1;
Character c2=(Character)o2;
Integer i1=(Integer)tr.get(o1);
Integer i2=(Integer)tr.get(o2);
int num=i2.compareTo(i1);
if(num==0)
return c1.compareTo(c2);
return num;
}
}
public class Test1 {
public static void sop(Object obj)
{
System.out.println(obj);
}
public static String filter(String str) //定义过滤输入字符串的方法,去掉除字母外的字符,返回输入的字母字符串
{
StringBuffer a = new StringBuffer();
char[] ch = str.toCharArray();
for(char c:ch)
{
if(c>='a'&&c<='z')
a.append(c);
}
return a.toString();
}
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
String str = filter(input);
sop(charCount(str));
}
public static String charCount(String st){
char[] ch = st.toCharArray();
StringBuffer sb = new StringBuffer();
Map<Character,Integer> mp = new HashMap<Character,Integer>();
for(char c:ch){
Integer count = mp.get(c);
if(count==null)
mp.put(c, 1);
else{
count++;
mp.put(c, count);
}
}
MyComparator myC=new MyComparator(mp);
TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>(myC);
tm.putAll(mp);
Set<Character> keyset = tm.keySet(); //调用KeySet方法遍历集合tm
Iterator<Character> it = keyset.iterator();
while(it.hasNext()){
Character key = it.next();
Integer value = tm.get(key);
sb.append(key+"("+value+")");
}
return sb.toString();
}
}
package demo;
/*
需求:获取一个字符串中出现的字母及其出现次数。
分析:字符串每位上的字符进行遍历,然后将每位上的字符添加入定义好的一个Map集合。存储动作时加上判断,如果集合中不存在该键(字符作键),添加该键值(字符,1),如果存在则值加1.
步骤:
1.键盘获取一个字符串对象.
2.定义一个Map,遍历字符串,将每一位上的字符当作键,存入Map集合。
3.存储都做加上判断,集合中没有,则值为1,存入。集合中有,则将已有值加一存入。
4.遍历Map集合并打印,达到要求格式。
*/
import java.util.Map;
import java.util.TreeMap;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
class ApearNum
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.println("请输入需要获取出现字母及其次数的字符串:");
String str = in.nextLine();
TreeMap <Character,Integer> strMap = new TreeMap<>();
for(int i=0;i<str.length();i++) //这里,突然想到增强for,适用于集合和数组,但不论从哪方面来说,String我都觉得他足够具有特殊性。
//for(Character str.charAt(i) : str) //所以这里,对增强for是否适用于String,进行了实验,事实证明,不行.
//for(Character charI : str)
{
//Character temp =charI;
Character temp=str.charAt(i);
if(strMap.get(temp)==null)
{
strMap.put(temp,1);
}
else
{
strMap.put(temp,strMap.get(temp)+1);
}
}
System.out.println(strMap);
//TreeSet <Character> strSet = (TreeSet)strMap.keySet(); 这里,运行出现类型转换异常,可以得知,keySet()得到的键集合是与Map对应的类型.
//TreeSet <Character> strSet =(TreeSet)strMap.keySet(); 为什么这里,我已经将Map改成TreeMap还是类型转换异常?
//通过查看底层源码得知:虽然键集合的确符合TreeSet或者HashSet集合的特性,但他其实是SortedSet的一个子类,并不是想当然的是HashSet或者TreeSet.
Set <Character> strSet = strMap.keySet();
StringBuilder strSB = new StringBuilder();
for(Character key : strSet)
{
strSB.append("[").append(key+":").append(strMap.get(key)).append("] ");
}
System.out.println(strSB);
}
}